Slider.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /*
  2. * Copyright (c) 2021, kleines Filmröllchen <filmroellchen@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "Slider.h"
  7. #include "WidgetWithLabel.h"
  8. #include <AK/FixedPoint.h>
  9. #include <AK/Math.h>
  10. ProcessorParameterSlider::ProcessorParameterSlider(Orientation orientation, DSP::ProcessorRangeParameter& parameter, RefPtr<GUI::Label> value_label)
  11. : Slider(orientation)
  12. , WidgetWithLabel(move(value_label))
  13. , m_parameter(parameter)
  14. {
  15. if (!is_logarithmic()) {
  16. set_range(m_parameter.min_value().raw(), m_parameter.max_value().raw());
  17. set_value(m_parameter.value().raw());
  18. set_step((m_parameter.min_value() - m_parameter.max_value()).raw() / slider_steps);
  19. } else {
  20. auto min_log = m_parameter.min_value().log2().raw();
  21. auto max_log = m_parameter.max_value().log2().raw();
  22. auto value_log = m_parameter.value().log2().raw();
  23. set_range(min_log, max_log);
  24. set_value(value_log);
  25. set_step((min_log - max_log) / slider_steps);
  26. }
  27. set_tooltip(m_parameter.name());
  28. m_value_label->set_text(String::formatted("{:.2f}", static_cast<double>(m_parameter)));
  29. on_change = [this](auto value) {
  30. DSP::ParameterFixedPoint real_value;
  31. real_value.raw() = value;
  32. if (is_logarithmic())
  33. // FIXME: Implement exponential for fixed point
  34. real_value = exp(static_cast<double>(real_value));
  35. m_parameter.set_value_sneaky(real_value, DSP::Detail::ProcessorParameterSetValueTag {});
  36. if (m_value_label) {
  37. double value = static_cast<double>(m_parameter);
  38. String label_text = String::formatted("{:.2f}", value);
  39. // FIXME: This is a magic value; we know that with normal font sizes, the label will disappear starting from approximately this length.
  40. // Can we do this dynamically?
  41. if (label_text.length() > 7)
  42. m_value_label->set_text(String::formatted("{:.0f}", value));
  43. else
  44. m_value_label->set_text(label_text);
  45. }
  46. };
  47. m_parameter.did_change_value = [this](auto value) {
  48. if (!is_logarithmic())
  49. set_value(value.raw());
  50. else
  51. set_value(value.log2().raw());
  52. };
  53. }