新增slider控件
mixer_track新增音量控制滑条
This commit is contained in:
parent
5f021abd4a
commit
8260d421ad
@ -1 +1,80 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <gtkmm/drawingarea.h>
|
||||||
|
#include <gtkmm/eventcontroller.h>
|
||||||
|
#include <gtkmm/gesturedrag.h>
|
||||||
|
#include "spdlog/spdlog.h"
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class w_slider : public Gtk::DrawingArea {
|
||||||
|
public:
|
||||||
|
explicit w_slider(bool vertical = false);
|
||||||
|
void set_value(T value) {
|
||||||
|
value_ = std::clamp(value, min_, max_);
|
||||||
|
queue_draw();
|
||||||
|
}
|
||||||
|
void set_value_range(T min, T max) {
|
||||||
|
min_ = min;
|
||||||
|
max_ = max;
|
||||||
|
}
|
||||||
|
|
||||||
|
sigc::signal<void(T)> signal_value_changed() {
|
||||||
|
return signal_value_changed_;
|
||||||
|
}
|
||||||
|
const bool is_vertical;
|
||||||
|
private:
|
||||||
|
void on_draw(const Cairo::RefPtr<Cairo::Context>& cr, int width, int height);
|
||||||
|
void on_begin_drag(double x, double y);
|
||||||
|
void on_drag(double x, double y);
|
||||||
|
T value_ = T{};
|
||||||
|
T min_ = T{};
|
||||||
|
T max_ = T{};
|
||||||
|
sigc::signal<void(T)> signal_value_changed_;
|
||||||
|
T begin_drag_value_ = T{};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void w_slider<T>::on_begin_drag(double x, double y) {
|
||||||
|
begin_drag_value_ = value_;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void w_slider<T>::on_drag(double x, double y) {
|
||||||
|
if (is_vertical) {
|
||||||
|
double delta = y / get_allocated_height();
|
||||||
|
set_value(begin_drag_value_ - delta);
|
||||||
|
} else {
|
||||||
|
double delta = x / get_allocated_width();
|
||||||
|
set_value(begin_drag_value_ + delta);
|
||||||
|
}
|
||||||
|
signal_value_changed_.emit(value_);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
w_slider<T>::w_slider(bool vertical) : is_vertical(vertical) {
|
||||||
|
set_content_height(10);
|
||||||
|
set_content_width(10);
|
||||||
|
set_draw_func(sigc::mem_fun(*this, &w_slider::on_draw));
|
||||||
|
auto controller = Gtk::GestureDrag::create();
|
||||||
|
controller->signal_drag_begin().connect(sigc::mem_fun(*this, &w_slider::on_begin_drag));
|
||||||
|
controller->signal_drag_update().connect(sigc::mem_fun(*this, &w_slider::on_drag));
|
||||||
|
|
||||||
|
add_controller(controller);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void w_slider<T>::on_draw(const Cairo::RefPtr<Cairo::Context> &cr, int width, int height) {
|
||||||
|
// Draw a black rectangle.
|
||||||
|
cr->set_source_rgba(0.0, 0.0, 0.0, 1.0);
|
||||||
|
cr->fill();
|
||||||
|
|
||||||
|
// draw value bar
|
||||||
|
cr->set_source_rgba(0.0, 1.0, 1.0, 1.0);
|
||||||
|
if (is_vertical) {
|
||||||
|
cr->rectangle(0, height * (1 - value_), width, height * value_);
|
||||||
|
} else {
|
||||||
|
cr->rectangle(0, 0, width * value_, height);
|
||||||
|
}
|
||||||
|
cr->fill();
|
||||||
|
|
||||||
|
cr->stroke();
|
||||||
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "w_mixer_track.h"
|
#include "w_mixer_track.h"
|
||||||
|
|
||||||
#include "audio/mixer/mixer_track.h"
|
#include "audio/mixer/mixer_track.h"
|
||||||
|
#include <gtkmm/adjustment.h>
|
||||||
|
|
||||||
std::string vertical_text(const std::string& text) {
|
std::string vertical_text(const std::string& text) {
|
||||||
std::string result;
|
std::string result;
|
||||||
@ -11,13 +12,23 @@ std::string vertical_text(const std::string& text) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
w_mixer_track::w_mixer_track() : Box(Gtk::Orientation::HORIZONTAL) {
|
w_mixer_track::w_mixer_track() : Box(Gtk::Orientation::HORIZONTAL), track_(nullptr), volume_scale_(true) {
|
||||||
|
auto volume_adjustment = Gtk::Adjustment::create(0.0, 0.0, 1.2, 0.01, 0.1, 0.0);
|
||||||
|
volume_scale_.set_value_range(0.0, 1.2);
|
||||||
|
volume_scale_.signal_value_changed().connect(sigc::mem_fun(*this, &w_mixer_track::on_volume_scale_value_changed));
|
||||||
|
append(volume_scale_);
|
||||||
append(audio_buffer_bar_);
|
append(audio_buffer_bar_);
|
||||||
append(label_);
|
append(label_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void w_mixer_track::set_mixer_track(mixer_track* track) {
|
void w_mixer_track::set_mixer_track(mixer_track* track) {
|
||||||
track_ = track;
|
track_ = track;
|
||||||
|
volume_scale_.set_value(track_->get_volume());
|
||||||
audio_buffer_bar_.set_buffers(track_->ui_buffers);
|
audio_buffer_bar_.set_buffers(track_->ui_buffers);
|
||||||
label_.set_text(vertical_text(track_->get_name().c_str()));
|
label_.set_text(vertical_text(track_->get_name().c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void w_mixer_track::on_volume_scale_value_changed(float value) {
|
||||||
|
if (track_)
|
||||||
|
track_->set_volume(value);
|
||||||
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <gtkmm/label.h>
|
#include <gtkmm/label.h>
|
||||||
|
|
||||||
#include "widget/misc/w_audio_buffer_bar.h"
|
#include "widget/misc/w_audio_buffer_bar.h"
|
||||||
|
#include "widget/misc/slider.h"
|
||||||
|
|
||||||
class mixer_track;
|
class mixer_track;
|
||||||
|
|
||||||
@ -11,7 +12,9 @@ public:
|
|||||||
w_mixer_track();
|
w_mixer_track();
|
||||||
void set_mixer_track(mixer_track* track);
|
void set_mixer_track(mixer_track* track);
|
||||||
private:
|
private:
|
||||||
|
void on_volume_scale_value_changed(float value);
|
||||||
mixer_track* track_;
|
mixer_track* track_;
|
||||||
w_audio_buffer_bar audio_buffer_bar_;
|
w_audio_buffer_bar audio_buffer_bar_;
|
||||||
Gtk::Label label_;
|
Gtk::Label label_;
|
||||||
|
w_slider<float> volume_scale_;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user