summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndré Nusser <andre.nusser@googlemail.com>2017-05-24 16:21:12 +0200
committerAndré Nusser <andre.nusser@googlemail.com>2017-05-24 17:12:15 +0200
commit13ab76b2d587a786112a35b5bcccf5e264700f9e (patch)
tree0d1756b0a7be57b115c0da9581b4aa4cc12939a2
parent76c46d5b6cfa400f3bbdc742008dcfed9782a339 (diff)
Add frame in the GUI for bleed control.
-rw-r--r--plugin/Makefile.mingw32.in1
-rw-r--r--plugin/drumgizmo_plugin.h2
-rw-r--r--plugingui/Makefile.am1
-rw-r--r--plugingui/Makefile.mingw321
-rw-r--r--plugingui/bleedcontrolframecontent.cc104
-rw-r--r--plugingui/bleedcontrolframecontent.h69
-rw-r--r--plugingui/diskstreamingframecontent.cc12
-rw-r--r--plugingui/diskstreamingframecontent.h2
-rw-r--r--plugingui/layout.cc29
-rw-r--r--plugingui/layout.h3
-rw-r--r--plugingui/maintab.cc59
-rw-r--r--plugingui/maintab.h8
-rw-r--r--plugingui/testmain.cc3
13 files changed, 251 insertions, 43 deletions
diff --git a/plugin/Makefile.mingw32.in b/plugin/Makefile.mingw32.in
index 77f43e1..b22febd 100644
--- a/plugin/Makefile.mingw32.in
+++ b/plugin/Makefile.mingw32.in
@@ -47,6 +47,7 @@ DG_CFLAGS = -I@top_srcdir@ -I@top_srcdir@/include -I@top_srcdir@/src \
GUI_SRC = \
@top_srcdir@/plugingui/abouttab.cc \
+ @top_srcdir@/plugingui/bleedcontrolframecontent.cc \
@top_srcdir@/plugingui/button.cc \
@top_srcdir@/plugingui/button_base.cc \
@top_srcdir@/plugingui/checkbox.cc \
diff --git a/plugin/drumgizmo_plugin.h b/plugin/drumgizmo_plugin.h
index 2a77f07..e585c45 100644
--- a/plugin/drumgizmo_plugin.h
+++ b/plugin/drumgizmo_plugin.h
@@ -208,5 +208,5 @@ private:
bool inline_image_first_draw{true};
static constexpr std::size_t width{750};
- static constexpr std::size_t height{385};
+ static constexpr std::size_t height{466};
};
diff --git a/plugingui/Makefile.am b/plugingui/Makefile.am
index dd36783..c8004b0 100644
--- a/plugingui/Makefile.am
+++ b/plugingui/Makefile.am
@@ -48,6 +48,7 @@ libdggui_la_LIBADD = \
# If you add a file here, remember to add it to plugin/Makefile.mingw32.in
nodist_libdggui_la_SOURCES = \
abouttab.cc \
+ bleedcontrolframecontent.cc \
button.cc \
button_base.cc \
checkbox.cc \
diff --git a/plugingui/Makefile.mingw32 b/plugingui/Makefile.mingw32
index 39ff2d0..597ecd9 100644
--- a/plugingui/Makefile.mingw32
+++ b/plugingui/Makefile.mingw32
@@ -43,6 +43,7 @@ GUI_SRC = \
statusframecontent.cc \
humanizerframecontent.cc \
diskstreamingframecontent.cc \
+ bleedcontrolframecontent.cc \
maintab.cc \
frame.cc \
knob.cc \
diff --git a/plugingui/bleedcontrolframecontent.cc b/plugingui/bleedcontrolframecontent.cc
new file mode 100644
index 0000000..65c0f7c
--- /dev/null
+++ b/plugingui/bleedcontrolframecontent.cc
@@ -0,0 +1,104 @@
+/* -*- Mode: c++ -*- */
+/***************************************************************************
+ * bleedcontrolframecontent.cc
+ *
+ * Wed May 24 14:40:16 CEST 2017
+ * Copyright 2017 André Nusser
+ * andre.nusser@googlemail.com
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * DrumGizmo is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "bleedcontrolframecontent.h"
+
+#include <settings.h>
+
+#include <limits>
+
+namespace GUI
+{
+
+BleedcontrolframeContent::BleedcontrolframeContent(Widget* parent,
+ Settings& settings,
+ SettingsNotifier& settings_notifier)
+ : Widget(parent)
+ , slider_width{250}
+ , settings(settings)
+ , settings_notifier(settings_notifier)
+{
+ label_text.setText("Amount of Microphone Bleed:");
+ label_text.setAlignment(TextAlignment::center);
+
+ button.setText("Apply");
+ button.setEnabled(false);
+
+ label_value.setText("0 %");
+ label_value.setAlignment(TextAlignment::center);
+
+ // TODO:
+ // connect to settings (see diskstreaming frame)
+}
+
+void BleedcontrolframeContent::resize(std::size_t width, std::size_t height)
+{
+ Widget::resize(width, height);
+
+ int slider_button_gap = 10;
+
+ slider_width = 0.8 * width;
+ button_width = std::max((int)width - slider_width - slider_button_gap, 0);
+
+ label_text.move(0, 0);
+ slider.move(0, 20);
+ button.move(slider_width + slider_button_gap, 10);
+ label_value.move(0, 40);
+
+ label_text.resize(slider_width, 15);
+ slider.resize(slider_width, 15);
+ button.resize(button_width, 30);
+ label_value.resize(slider_width, 15);
+
+ button.setEnabled(false);
+}
+
+void BleedcontrolframeContent::bleedSettingsValueChanged(float value)
+{
+ slider.setValue(value);
+
+ label_value.setText(std::to_string(100 * value) + " %");
+ slider.setColour(Slider::Colour::Blue);
+
+ button.setEnabled(true);
+}
+
+void BleedcontrolframeContent::bleedValueChanged(float value)
+{
+ // TODO: store new value in settings
+}
+
+void BleedcontrolframeContent::reloadClicked()
+{
+ // TODO
+}
+
+void BleedcontrolframeContent::reloaded(float)
+{
+ button.setEnabled(false);
+}
+
+} // GUI::
diff --git a/plugingui/bleedcontrolframecontent.h b/plugingui/bleedcontrolframecontent.h
new file mode 100644
index 0000000..2fefd64
--- /dev/null
+++ b/plugingui/bleedcontrolframecontent.h
@@ -0,0 +1,69 @@
+/* -*- Mode: c++ -*- */
+/***************************************************************************
+ * bleedcontrolframecontent.h
+ *
+ * Wed May 24 14:40:16 CEST 2017
+ * Copyright 2017 André Nusser
+ * andre.nusser@googlemail.com
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * DrumGizmo is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "button.h"
+#include "label.h"
+#include "slider.h"
+#include "widget.h"
+
+struct Settings;
+class SettingsNotifier;
+
+namespace GUI
+{
+
+class BleedcontrolframeContent : public Widget
+{
+public:
+ BleedcontrolframeContent(Widget* parent,
+ Settings& settings,
+ SettingsNotifier& settings_notifier);
+
+ // From Widget
+ virtual void resize(std::size_t width, std::size_t height) override;
+
+private:
+ void bleedSettingsValueChanged(float value);
+ void bleedValueChanged(float value);
+ void reloadClicked();
+ void reloaded(float);
+
+ Label label_text{this};
+ Label label_value{this};
+
+ Slider slider{this};
+ Button button{this};
+
+ int slider_width;
+ int button_width;
+
+ Settings& settings;
+ SettingsNotifier& settings_notifier;
+};
+
+} // GUI::
+#pragma once
diff --git a/plugingui/diskstreamingframecontent.cc b/plugingui/diskstreamingframecontent.cc
index 4bd9cad..008aee3 100644
--- a/plugingui/diskstreamingframecontent.cc
+++ b/plugingui/diskstreamingframecontent.cc
@@ -47,8 +47,8 @@ DiskstreamingframeContent::DiskstreamingframeContent(Widget* parent,
button.setText("Apply");
button.setEnabled(false);
- label_size.setText("0 MB");
- label_size.setAlignment(TextAlignment::center);
+ label_value.setText("0 MB");
+ label_value.setAlignment(TextAlignment::center);
CONNECT(this, settings_notifier.disk_cache_upper_limit,
this, &DiskstreamingframeContent::limitSettingsValueChanged);
@@ -81,12 +81,12 @@ void DiskstreamingframeContent::resize(std::size_t width, std::size_t height)
label_text.move(0, 0);
slider.move(0, 20);
button.move(slider_width + slider_button_gap, 10);
- label_size.move(0, 40);
+ label_value.move(0, 40);
label_text.resize(slider_width, 15);
slider.resize(slider_width, 15);
button.resize(button_width, 30);
- label_size.resize(slider_width, 15);
+ label_value.resize(slider_width, 15);
button.setEnabled(false);
}
@@ -98,11 +98,11 @@ void DiskstreamingframeContent::limitSettingsValueChanged(std::size_t value)
if (new_slider_value < 0.99) {
int value_in_mb = value/(1024 * 1024);
- label_size.setText(std::to_string(value_in_mb) + " MB");
+ label_value.setText(std::to_string(value_in_mb) + " MB");
slider.setColour(Slider::Colour::Blue);
}
else {
- label_size.setText("Unlimited");
+ label_value.setText("Unlimited");
slider.setColour(Slider::Colour::Grey);
}
diff --git a/plugingui/diskstreamingframecontent.h b/plugingui/diskstreamingframecontent.h
index e404807..eabc6e2 100644
--- a/plugingui/diskstreamingframecontent.h
+++ b/plugingui/diskstreamingframecontent.h
@@ -58,7 +58,7 @@ private:
static constexpr std::size_t max_limit = 1024.0 * 1024.0 * 1024.0 * 4.0 - 1;
Label label_text{this};
- Label label_size{this};
+ Label label_value{this};
Slider slider{this};
Button button{this};
diff --git a/plugingui/layout.cc b/plugingui/layout.cc
index 1e18c40..da64d1b 100644
--- a/plugingui/layout.cc
+++ b/plugingui/layout.cc
@@ -293,6 +293,35 @@ void GridLayout::setPosition(LayoutItem* item, GridRange const& range)
grid_ranges[item] = range;
}
+int GridLayout::lastUsedRow(int column) const
+{
+ int last_row = -1;
+
+ for (auto const& grid_range : grid_ranges) {
+ auto const& range = grid_range.second;
+ if (column >= range.column_begin && column < range.column_end) {
+ last_row = std::max(last_row, range.row_end - 1);
+ }
+ }
+
+ return last_row;
+}
+
+int GridLayout::lastUsedColumn(int row) const
+{
+ int last_column = -1;
+
+ for (auto const& grid_range : grid_ranges) {
+ auto const& range = grid_range.second;
+ if (row >= range.row_begin && row < range.row_end) {
+ last_column = std::max(last_column, range.column_end - 1);
+ }
+ }
+
+ return last_column;
+
+}
+
auto GridLayout::calculateCellSize() const -> CellSize
{
auto empty_width = (number_of_columns - 1) * spacing;
diff --git a/plugingui/layout.h b/plugingui/layout.h
index 763f616..210c86e 100644
--- a/plugingui/layout.h
+++ b/plugingui/layout.h
@@ -169,6 +169,9 @@ public:
void setPosition(LayoutItem* item, GridRange const& range);
+ int lastUsedRow(int column) const;
+ int lastUsedColumn(int row) const;
+
protected:
std::size_t number_of_columns;
std::size_t number_of_rows;
diff --git a/plugingui/maintab.cc b/plugingui/maintab.cc
index f0743a8..8238988 100644
--- a/plugingui/maintab.cc
+++ b/plugingui/maintab.cc
@@ -26,9 +26,13 @@
*/
#include "maintab.h"
+// FIXME:
+#include <iostream>
+
namespace GUI
{
+// TODO: Reduce boilerplate code in this constructor
MainTab::MainTab(Widget* parent,
Settings& settings,
SettingsNotifier& settings_notifier,
@@ -38,6 +42,7 @@ MainTab::MainTab(Widget* parent,
, statusframe_content{this, settings_notifier}
, humanizerframe_content{this, settings, settings_notifier}
, diskstreamingframe_content{this, settings, settings_notifier}
+ , bleedcontrolframe_content{this, settings, settings_notifier}
, resamplingframe_content{this, settings_notifier}
, settings(settings)
, settings_notifier(settings_notifier)
@@ -45,39 +50,12 @@ MainTab::MainTab(Widget* parent,
layout.setSpacing(0);
layout.setResizeChildren(true);
- layout.addItem(&drumkit_frame);
- layout.addItem(&status_frame);
- layout.addItem(&humanizer_frame);
- layout.addItem(&diskstreaming_frame);
- layout.addItem(&resampling_frame);
-
- auto h1 = 20;
- auto h2 = 20;
- auto h3 = 13;
- auto h4 = 11;
- auto h5 = 14;
- auto drumkit_range = GridLayout::GridRange{0, 1, 0, h1};
- auto status_range = GridLayout::GridRange{0, 1, h1, h1 + h2};
- auto humanizer_range = GridLayout::GridRange{1, 2, 0, h3};
- auto diskstreaming_range = GridLayout::GridRange{1, 2, h3, h3 + h4};
- auto resampling_range = GridLayout::GridRange{1, 2, h3 + h4, h3 + h4 + h5};
- layout.setPosition(&drumkit_frame, drumkit_range);
- layout.setPosition(&status_frame, status_range);
- layout.setPosition(&humanizer_frame, humanizer_range);
- layout.setPosition(&diskstreaming_frame, diskstreaming_range);
- layout.setPosition(&resampling_frame, resampling_range);
-
- drumkit_frame.setTitle("Drumkit");
- status_frame.setTitle("Status");
- humanizer_frame.setTitle("Humanizer");
- diskstreaming_frame.setTitle("Disk streaming");
- resampling_frame.setTitle("Resampling");
-
- drumkit_frame.setContent(&drumkitframe_content);
- status_frame.setContent(&statusframe_content);
- humanizer_frame.setContent(&humanizerframe_content);
- diskstreaming_frame.setContent(&diskstreamingframe_content);
- resampling_frame.setContent(&resamplingframe_content);
+ add("Drumkit", drumkit_frame, drumkitframe_content, 20, 0);
+ add("Status", status_frame, statusframe_content, 29, 0);
+ add("Humanizer", humanizer_frame, humanizerframe_content, 13, 1);
+ add("Disk Streaming", diskstreaming_frame, diskstreamingframe_content, 11, 1);
+ add("Bleed Control", bleedcontrol_frame, bleedcontrolframe_content, 11, 1);
+ add("Resampling", resampling_frame, resamplingframe_content, 14, 1);
humanizer_frame.setOnSwitch(settings.enable_velocity_modifier);
resampling_frame.setOnSwitch(settings.enable_resampling);
@@ -112,4 +90,19 @@ void MainTab::resamplingOnChange(bool on)
settings.enable_resampling.store(on);
}
+void MainTab::add(std::string const& title, FrameWidget& frame, Widget& content,
+ std::size_t height, int column)
+{
+ layout.addItem(&frame);
+ frame.setTitle(title);
+ frame.setContent(&content);
+
+ auto grid_start = layout.lastUsedRow(column) + 1;
+ auto range = GridLayout::GridRange{column,
+ column + 1,
+ grid_start,
+ grid_start + int(height)};
+ layout.setPosition(&frame, range);
+}
+
} // GUI::
diff --git a/plugingui/maintab.h b/plugingui/maintab.h
index ab7e760..3463355 100644
--- a/plugingui/maintab.h
+++ b/plugingui/maintab.h
@@ -33,6 +33,7 @@
#include "statusframecontent.h"
#include "humanizerframecontent.h"
#include "diskstreamingframecontent.h"
+#include "bleedcontrolframecontent.h"
#include "resamplingframecontent.h"
struct Settings;
@@ -60,20 +61,25 @@ private:
Image logo{":resources/logo.png"};
- GridLayout layout{this, 2, 40};
+ GridLayout layout{this, 2, 49};
FrameWidget drumkit_frame{this, false};
FrameWidget status_frame{this, false};
FrameWidget humanizer_frame{this, true};
FrameWidget diskstreaming_frame{this, false};
+ FrameWidget bleedcontrol_frame{this, false};
FrameWidget resampling_frame{this, true};
DrumkitframeContent drumkitframe_content;
StatusframeContent statusframe_content;
HumanizerframeContent humanizerframe_content;
DiskstreamingframeContent diskstreamingframe_content;
+ BleedcontrolframeContent bleedcontrolframe_content;
ResamplingframeContent resamplingframe_content;
+ void add(std::string const& title, FrameWidget& frame, Widget& content,
+ std::size_t height, int column);
+
Settings& settings;
SettingsNotifier& settings_notifier;
};
diff --git a/plugingui/testmain.cc b/plugingui/testmain.cc
index 5231205..07e5f8d 100644
--- a/plugingui/testmain.cc
+++ b/plugingui/testmain.cc
@@ -48,7 +48,8 @@ int main()
parent.show();
main_window.show();
- parent.resize(750, 400);
+ // TODO: automatically use drumgizmo_plugin.h size here
+ parent.resize(750, 466);
while(true)
{