自定义内存分配池
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
/.idea
|
||||
|
||||
/third_party/Graphic_Core/Renderive.zip
|
||||
/cmake-build-vs2019_asan/
|
||||
/clion_none_git_dir/
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#ifndef Application_H
|
||||
#define Application_H
|
||||
#include <QApplication>
|
||||
#include <QStack>
|
||||
class Main_Widget;
|
||||
class Application : public QApplication {
|
||||
public:
|
||||
|
||||
@@ -4,11 +4,13 @@
|
||||
#include <QObject>
|
||||
#include <QTimer>
|
||||
#include <QKeyEvent>
|
||||
#include <QThread>
|
||||
#include <map>
|
||||
|
||||
class Back_End : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
QMap<QString, Qt::Key> function_map;
|
||||
std::map<QString, Qt::Key> function_map;
|
||||
bool match(QKeyEvent* e, const QString& function);
|
||||
static Back_End* instance();
|
||||
int YsGetAfGain();
|
||||
@@ -22,12 +24,22 @@ public:
|
||||
QString get_screenshot_save_dir_path();
|
||||
QString get_screenshot_save_file_name();
|
||||
QString get_audio_file_location();
|
||||
void stop_mock_thread() {
|
||||
if (mock_thread) {
|
||||
mock_thread->quit();
|
||||
mock_thread->wait();
|
||||
mock_thread = nullptr;
|
||||
}
|
||||
}
|
||||
Back_End(const Back_End&) = delete;
|
||||
Back_End& operator=(const Back_End&) = delete;
|
||||
void call_back_data_func(int channel, void *pData, int i_length);
|
||||
protected:
|
||||
Back_End();
|
||||
~Back_End() override = default;
|
||||
~Back_End() override {
|
||||
stop_mock_thread();
|
||||
}
|
||||
QThread* mock_thread{};
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -6,6 +6,93 @@
|
||||
#include "IntermediateFrequencyWidget.h"
|
||||
#include "RadioWidget.h"
|
||||
#include "SweepFrequencyWidget.h"
|
||||
#include <algorithm>
|
||||
#include <memory_resource>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include "../../../third_party/Renderive/Renderive/Generate_Mock_Data.h"
|
||||
#include "../../../third_party/Renderive/Renderive/base/Memory.h"
|
||||
namespace {
|
||||
struct Mock_Config {
|
||||
bool performance{};
|
||||
int interval_ms = 10;
|
||||
int batch_count = 1;
|
||||
};
|
||||
int read_env_int(const char* name, int fallback) {
|
||||
bool ok = false;
|
||||
int value = qEnvironmentVariableIntValue(name, &ok);
|
||||
return ok ? value : fallback;
|
||||
}
|
||||
Mock_Config read_mock_config() {
|
||||
Mock_Config config;
|
||||
config.performance = read_env_int("RADIO_MOCK_PERF_MODE", 1) != 0;
|
||||
config.interval_ms = std::max(1, read_env_int("RADIO_MOCK_INTERVAL_MS", config.performance ? 1 : 10));
|
||||
config.batch_count = std::max(1, read_env_int("RADIO_MOCK_BATCH_COUNT", config.performance ? 4 : 1));
|
||||
return config;
|
||||
}
|
||||
std::pmr::vector<double> make_random_data(renderive::Range range, int size, renderive::Memory_Domain domain) {
|
||||
if (range.origin > range.target)
|
||||
std::swap(range.origin, range.target);
|
||||
std::pmr::vector<double> data(renderive::memory_resource(domain));
|
||||
data.resize(size);
|
||||
renderive::fill_data(range, data);
|
||||
return data;
|
||||
}
|
||||
double make_random_value(renderive::Range range) {
|
||||
if (range.origin > range.target)
|
||||
std::swap(range.origin, range.target);
|
||||
return renderive::get_data(range);
|
||||
}
|
||||
void push_radio_data(Radio_Widget* rw) {
|
||||
if (!rw || !rw->spectrogram_line || !rw->water_fall || !rw->time_power || !rw->audio_spectrogram_plot || !rw->progress_bar1 || !rw->progress_bar2)
|
||||
return;
|
||||
{
|
||||
auto r = rw->spectrogram_line->power_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
auto data = make_random_data(nr, rw->spectrogram_line->frequency_point_size(), renderive::Memory_Domain::Spectrum);
|
||||
double middle_power = data.empty() ? nr.center() : data[data.size() / 2];
|
||||
rw->spectrogram_line->give_data(std::move(data));
|
||||
rw->progress_bar1->setValue(middle_power);
|
||||
}
|
||||
{
|
||||
rw->water_fall->give_data(QTime::currentTime(), make_random_data(rw->water_fall->power_range(), rw->water_fall->frequency_point_size(), renderive::Memory_Domain::Waterfall));
|
||||
}
|
||||
{
|
||||
int tick = rw->time_power->time_axis()->give_data(QTime::currentTime());
|
||||
renderive::Range r = rw->time_power->value_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
rw->time_power->give_data(tick, make_random_value(nr));
|
||||
}
|
||||
{
|
||||
auto r = rw->audio_spectrogram_plot->power_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
rw->audio_spectrogram_plot->give_data(make_random_data(nr, rw->audio_spectrogram_plot->frequency_point_size(), renderive::Memory_Domain::Spectrum));
|
||||
}
|
||||
rw->progress_bar2->setValue(make_random_value({1, 5}));
|
||||
}
|
||||
void push_radio_data_perf(Radio_Widget* rw) {
|
||||
if (!rw || !rw->spectrogram_line || !rw->water_fall || !rw->time_power || !rw->audio_spectrogram_plot || !rw->progress_bar1 || !rw->progress_bar2)
|
||||
return;
|
||||
{
|
||||
renderive::Range nr = {40, 120};
|
||||
auto data = make_random_data(nr, 1024, renderive::Memory_Domain::Spectrum);
|
||||
double middle_power = data.empty() ? nr.center() : data[data.size() / 2];
|
||||
rw->spectrogram_line->give_data(std::move(data));
|
||||
rw->progress_bar1->setValue(middle_power);
|
||||
}
|
||||
{
|
||||
rw->water_fall->give_data(QTime::currentTime(), make_random_data({0, 160}, 1024, renderive::Memory_Domain::Waterfall));
|
||||
}
|
||||
{
|
||||
int tick = rw->time_power->time_axis()->give_data(QTime::currentTime());
|
||||
rw->time_power->give_data(tick, make_random_value({-6000, 6000}));
|
||||
}
|
||||
{
|
||||
rw->audio_spectrogram_plot->give_data(make_random_data({-6000, 6000}, 512, renderive::Memory_Domain::Spectrum));
|
||||
}
|
||||
rw->progress_bar2->setValue(make_random_value({1, 5}));
|
||||
}
|
||||
}
|
||||
void Back_End::play(const QString& fileName) {
|
||||
qDebug() << "播放音频文件:" << fileName;
|
||||
}
|
||||
@@ -67,55 +154,33 @@ Back_End::Back_End() {
|
||||
function_map["切换音量/RF Gain"] = Qt::Key_Return;
|
||||
function_map["特别增加"] = Qt::Key_PageUp;
|
||||
function_map["特别减小"] = Qt::Key_PageDown;
|
||||
auto timer = new QTimer(this);
|
||||
QObject::connect(timer, &QTimer::timeout, [&]() {
|
||||
int size = 1024;
|
||||
Mock_Config config = read_mock_config();
|
||||
QTimer::singleShot(0, this, [this, config]() {
|
||||
Radio_Widget* rw = Main_Widget::instance()->radio_widget;
|
||||
{
|
||||
auto r = rw->spectrogram_line->power_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
//QVector<double>&& d= renderive::get_data(nr, rw->spectrogram_line->frequent_point_size());
|
||||
QVector<double>&& d = renderive::get_data(nr, size);
|
||||
rw->spectrogram_line->give_data(d);
|
||||
}
|
||||
{
|
||||
QVector<double>&& d = renderive::get_data(rw->water_fall->power_range(), rw->water_fall->frequency_point_size());
|
||||
//qDebug() << "D == " << d.size();
|
||||
int tick = rw->water_fall->time_axis()->give_data(QTime::currentTime());
|
||||
rw->water_fall->give_data(tick, d);
|
||||
}
|
||||
{
|
||||
int tick = rw->time_power->time_axis()->give_data(QTime::currentTime());
|
||||
renderive::Range r = rw->time_power->value_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
rw->time_power->give_data(tick, renderive::get_data(nr));
|
||||
}
|
||||
{
|
||||
auto r = rw->audio_spectrogram_plot->power_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
//QVector<double>&& d= renderive::get_data(nr, rw->audio_spectrogram_plot->frequent_point_size());
|
||||
QVector<double>&& d = renderive::get_data(nr, 512);
|
||||
rw->audio_spectrogram_plot->give_data(d);
|
||||
}
|
||||
auto iw = Main_Widget::instance()->intermediate_frequency_widget;
|
||||
{
|
||||
auto r = iw->spectrogram_line->power_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
//QVector<double> d = renderive::get_data(nr, iw->spectrogram_line->frequent_point_size());
|
||||
QVector<double> d = renderive::get_data(nr, size);
|
||||
iw->spectrogram_line->give_data(d);
|
||||
}
|
||||
{
|
||||
//QVector<double> d= renderive::get_data(iw->afterglow->power_range(), iw->afterglow->frequent_point_size());
|
||||
QVector<double> d = renderive::get_data(iw->afterglow->power_range(), size);
|
||||
iw->afterglow->give_data(d);
|
||||
}
|
||||
auto sw = Main_Widget::instance()->sweep_frequency_widget;
|
||||
{
|
||||
QVector<double>&& sweepData = renderive::get_data(sw->sweep_frequency_line->power_axis()->coord_range(), sw->sweep_frequency_line->block_frequency_point_size());
|
||||
sw->sweep_frequency_line->give_data(sweepData);
|
||||
if (config.performance) {
|
||||
mock_thread = new QThread(this);
|
||||
auto worker = new QObject;
|
||||
worker->moveToThread(mock_thread);
|
||||
QObject::connect(mock_thread, &QThread::finished, worker, &QObject::deleteLater);
|
||||
QObject::connect(mock_thread, &QThread::started, worker, [worker, config, rw]() {
|
||||
auto timer = new QTimer(worker);
|
||||
timer->setTimerType(Qt::PreciseTimer);
|
||||
QObject::connect(timer, &QTimer::timeout, worker, [config, rw]() {
|
||||
for (int i = 0; i < config.batch_count; ++i)
|
||||
push_radio_data_perf(rw);
|
||||
});
|
||||
timer->start(config.interval_ms);
|
||||
});
|
||||
mock_thread->start();
|
||||
return;
|
||||
}
|
||||
auto timer = new QTimer(this);
|
||||
timer->setTimerType(Qt::PreciseTimer);
|
||||
QObject::connect(timer, &QTimer::timeout, this, [config, rw]() {
|
||||
for (int i = 0; i < config.batch_count; ++i)
|
||||
push_radio_data(rw);
|
||||
});
|
||||
timer->start(config.interval_ms);
|
||||
});
|
||||
timer->start(10);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
|
||||
#include <sndfile.h> // 用于音频文件写入
|
||||
#include <portaudio.h> // 用于音频播放
|
||||
#include <QVector> // Qt 的 QVector
|
||||
#include <QAudioFormat>
|
||||
#include <QAudioOutput>
|
||||
#include <alsa/asoundlib.h>
|
||||
#include <vector>
|
||||
#define BUFFER_SIZE 512 // 缓冲区大小
|
||||
Device_UHD* ys_radio;
|
||||
|
||||
@@ -105,7 +105,7 @@ void Back_End::call_back_data_func(int channel, void *pData, int i_length)
|
||||
// qDebug()<<"收到数据包大小"<<pUHDData->DataLen;
|
||||
//绘图用
|
||||
if(pUHDData->DataType == UHD_Enum_DataType::kd_fft ) {
|
||||
QVector<double> data;
|
||||
std::vector<double> data;
|
||||
data.clear();
|
||||
for(int i = 0; i < 1024; i++)
|
||||
{
|
||||
@@ -146,7 +146,7 @@ void Back_End::call_back_data_func(int channel, void *pData, int i_length)
|
||||
|
||||
//Main_Widget::instance()->radio_widget->giv
|
||||
|
||||
QVector<double> data(512);
|
||||
std::vector<double> data(512);
|
||||
for(int i = 0; i < 512; ++i){
|
||||
data[i] = rbuf[i];
|
||||
}
|
||||
@@ -334,4 +334,4 @@ QString Back_End::get_screenshot_save_dir_path() {
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#include "IntermediateFrequencyWidget.h"
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QVector>
|
||||
#include <QPainter>
|
||||
#include <QDebug>
|
||||
#include "../component/FrequentShower.h"
|
||||
@@ -57,11 +56,11 @@ QWidget* Intermediate_Frequency_Widget::create_spectrogram_power_plot() {
|
||||
}
|
||||
void contextMenuEvent(QContextMenuEvent* event) override {
|
||||
if (!menu) {
|
||||
auto ws =
|
||||
bw(cw(sp.get(), -1), "频谱图") +
|
||||
bw(cw(x_axis.get()), "频率x轴") +
|
||||
bw(cw(y_axis.get()), "功率y轴") +
|
||||
bw(cw(msr.get()), "多选框");
|
||||
auto ws = concat_widgets(
|
||||
bw(cw(sp.get(), -1), "频谱图"),
|
||||
bw(cw(x_axis.get()), "频率x轴"),
|
||||
bw(cw(y_axis.get()), "功率y轴"),
|
||||
bw(cw(msr.get()), "多选框"));
|
||||
menu = create_menu(this, ws);
|
||||
}
|
||||
menu->exec(event->globalPos());
|
||||
@@ -72,8 +71,10 @@ QWidget* Intermediate_Frequency_Widget::create_spectrogram_power_plot() {
|
||||
spectrogram_line = w->sp;
|
||||
progress_bar1->set_value = [this]() {
|
||||
double middle_frequent = this->spectrogram_line->frequency_range().center();
|
||||
bool ok;
|
||||
this->progress_bar1->value = spectrogram_line->get_power(middle_frequent, ok, renderive::SRC::Edit);
|
||||
bool ok = false;
|
||||
double power = spectrogram_line->get_power(middle_frequent, ok, renderive::SRC::Render);
|
||||
if (ok)
|
||||
this->progress_bar1->value = power;
|
||||
};
|
||||
return w;
|
||||
}
|
||||
@@ -120,11 +121,11 @@ QWidget* Intermediate_Frequency_Widget::create_Afterglow_Plot() {
|
||||
}
|
||||
void contextMenuEvent(QContextMenuEvent* event) override {
|
||||
if (!menu) {
|
||||
auto ws =
|
||||
bw(cw(ag.get(), -1), "余辉图") +
|
||||
bw(cw(x_axis.get()), "频率轴") +
|
||||
bw(cw(y_axis.get()), "功率概率轴") +
|
||||
bw(cw(msr.get()), "多选框");
|
||||
auto ws = concat_widgets(
|
||||
bw(cw(ag.get(), -1), "余辉图"),
|
||||
bw(cw(x_axis.get()), "频率轴"),
|
||||
bw(cw(y_axis.get()), "功率概率轴"),
|
||||
bw(cw(msr.get()), "多选框"));
|
||||
menu = create_menu(this, ws);
|
||||
}
|
||||
menu->exec(event->globalPos());
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "RadioWidget.h"
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QVector>
|
||||
#include <vector>
|
||||
#include "../component/FrequentShower.h"
|
||||
#include "../component/ProgressBar.h"
|
||||
#include "../Global.h"
|
||||
@@ -12,6 +12,24 @@
|
||||
static bool use_Performance_shower = false;
|
||||
static double max = 160;
|
||||
static renderive::Range frequent_range = {-12000, 12000};
|
||||
static bool radio_mock_perf_mode() {
|
||||
bool ok = false;
|
||||
int value = qEnvironmentVariableIntValue("RADIO_MOCK_PERF_MODE", &ok);
|
||||
return ok ? value != 0 : true;
|
||||
}
|
||||
static bool radio_show_performance_overlay() {
|
||||
bool ok = false;
|
||||
int value = qEnvironmentVariableIntValue("RADIO_SHOW_PERFORMANCE_OVERLAY", &ok);
|
||||
return ok ? value != 0 : false;
|
||||
}
|
||||
static void configure_radio_plot_perf(renderive::Plot* plot) {
|
||||
if (!radio_mock_perf_mode())
|
||||
return;
|
||||
plot->set_render_check_fps(1000);
|
||||
plot->set_render_schedule_mode(renderive::Plot_Render_Schedule_Mode::Chase_Latest);
|
||||
if (radio_show_performance_overlay())
|
||||
plot->set_use_performance_shower(true);
|
||||
}
|
||||
QWidget* Radio_Widget::create_spectrogram_power_plot() {
|
||||
class Spectrum_Plot : public renderive::Plot {
|
||||
public:
|
||||
@@ -22,6 +40,7 @@ QWidget* Radio_Widget::create_spectrogram_power_plot() {
|
||||
QMenu* menu{};
|
||||
void init() override {
|
||||
Plot::init();
|
||||
configure_radio_plot_perf(this);
|
||||
object_name = "Spectrum_Plot";
|
||||
auto data = create_renderable_node(get_root_renderable(), "Data_Renderable");
|
||||
auto axis = create_renderable_node(get_root_renderable(), "Axis_Renderable");
|
||||
@@ -52,11 +71,11 @@ QWidget* Radio_Widget::create_spectrogram_power_plot() {
|
||||
}
|
||||
void contextMenuEvent(QContextMenuEvent* event) override {
|
||||
if (!menu) {
|
||||
auto ws =
|
||||
bw(cw(sp.get(), -1), "频谱图") +
|
||||
bw(cw(x_axis.get()), "频率x轴") +
|
||||
bw(cw(y_axis.get()), "功率y轴") +
|
||||
bw(cw(msr.get()), "多选框");
|
||||
auto ws = concat_widgets(
|
||||
bw(cw(sp.get(), -1), "频谱图"),
|
||||
bw(cw(x_axis.get()), "频率x轴"),
|
||||
bw(cw(y_axis.get()), "功率y轴"),
|
||||
bw(cw(msr.get()), "多选框"));
|
||||
menu = create_menu(this, ws);
|
||||
}
|
||||
menu->exec(event->globalPos());
|
||||
@@ -65,11 +84,15 @@ QWidget* Radio_Widget::create_spectrogram_power_plot() {
|
||||
auto w = new Spectrum_Plot;
|
||||
w->init();
|
||||
spectrogram_line = w->sp;
|
||||
progress_bar1->set_value = [this]() {
|
||||
double middle_frequent = this->spectrogram_line->frequency_range().center();
|
||||
bool ok;
|
||||
this->progress_bar1->value = spectrogram_line->get_power(middle_frequent, ok, renderive::SRC::Edit);
|
||||
};
|
||||
if (!radio_mock_perf_mode()) {
|
||||
progress_bar1->set_value = [this]() {
|
||||
double middle_frequent = this->spectrogram_line->frequency_range().center();
|
||||
bool ok = false;
|
||||
double power = spectrogram_line->get_power(middle_frequent, ok, renderive::SRC::Render);
|
||||
if (ok)
|
||||
this->progress_bar1->setValue(power);
|
||||
};
|
||||
}
|
||||
return w;
|
||||
}
|
||||
QWidget* Radio_Widget::create_water_fall_plot() {
|
||||
@@ -82,6 +105,7 @@ QWidget* Radio_Widget::create_water_fall_plot() {
|
||||
QMenu* menu{};
|
||||
void init() override {
|
||||
Plot::init();
|
||||
configure_radio_plot_perf(this);
|
||||
object_name = "Water_Fall_Plot";
|
||||
auto data = create_renderable_node(get_root_renderable(), "Data_Renderable");
|
||||
auto axis = create_renderable_node(get_root_renderable(), "Axis_Renderable");
|
||||
@@ -114,11 +138,11 @@ QWidget* Radio_Widget::create_water_fall_plot() {
|
||||
}
|
||||
void contextMenuEvent(QContextMenuEvent* event) override {
|
||||
if (!menu) {
|
||||
auto ws =
|
||||
bw(cw(wf.get(), -1), "瀑布图") +
|
||||
bw(cw(x_axis.get()), "频率轴") +
|
||||
bw(cw(y_axis.get()), "时间轴") +
|
||||
bw(cw(msr.get()), "多选框");
|
||||
auto ws = concat_widgets(
|
||||
bw(cw(wf.get(), -1), "瀑布图"),
|
||||
bw(cw(x_axis.get()), "频率轴"),
|
||||
bw(cw(y_axis.get()), "时间轴"),
|
||||
bw(cw(msr.get()), "多选框"));
|
||||
menu = create_menu(this, ws);
|
||||
}
|
||||
menu->exec(event->globalPos());
|
||||
@@ -139,6 +163,7 @@ QWidget* Radio_Widget::create_audio_spectrogram_plot() {
|
||||
QMenu* menu{};
|
||||
void init() override {
|
||||
Plot::init();
|
||||
configure_radio_plot_perf(this);
|
||||
object_name = "Spectrum_Plot";
|
||||
auto data = create_renderable_node(get_root_renderable(), "Data_Renderable");
|
||||
auto axis = create_renderable_node(get_root_renderable(), "Axis_Renderable");
|
||||
@@ -169,11 +194,11 @@ QWidget* Radio_Widget::create_audio_spectrogram_plot() {
|
||||
}
|
||||
void contextMenuEvent(QContextMenuEvent* event) override {
|
||||
if (!menu) {
|
||||
auto ws =
|
||||
bw(cw(sp.get(), -1), "频谱图") +
|
||||
bw(cw(x_axis.get()), "频率x轴") +
|
||||
bw(cw(y_axis.get()), "功率y轴") +
|
||||
bw(cw(msr.get()), "多选框");
|
||||
auto ws = concat_widgets(
|
||||
bw(cw(sp.get(), -1), "频谱图"),
|
||||
bw(cw(x_axis.get()), "频率x轴"),
|
||||
bw(cw(y_axis.get()), "功率y轴"),
|
||||
bw(cw(msr.get()), "多选框"));
|
||||
menu = create_menu(this, ws);
|
||||
}
|
||||
menu->exec(event->globalPos());
|
||||
@@ -194,6 +219,7 @@ QWidget* Radio_Widget::create_time_power_plot() {
|
||||
QMenu* menu{};
|
||||
void init() override {
|
||||
Plot::init();
|
||||
configure_radio_plot_perf(this);
|
||||
object_name = "Audio_Plot";
|
||||
auto data = create_renderable_node(get_root_renderable(), "Data_Renderable");
|
||||
auto axis = create_renderable_node(get_root_renderable(), "Axis_Renderable");
|
||||
@@ -222,11 +248,11 @@ QWidget* Radio_Widget::create_time_power_plot() {
|
||||
}
|
||||
void contextMenuEvent(QContextMenuEvent* event) override {
|
||||
if (!menu) {
|
||||
auto ws =
|
||||
bw(cw(audio.get(), -1), "音频图") +
|
||||
bw(cw(y_axis.get()), "功率y轴") +
|
||||
bw(cw(x_axis.get()), "时间轴") +
|
||||
bw(cw(msr.get()), "多选框");
|
||||
auto ws = concat_widgets(
|
||||
bw(cw(audio.get(), -1), "音频图"),
|
||||
bw(cw(y_axis.get()), "功率y轴"),
|
||||
bw(cw(x_axis.get()), "时间轴"),
|
||||
bw(cw(msr.get()), "多选框"));
|
||||
menu = create_menu(this, ws);
|
||||
}
|
||||
menu->exec(event->globalPos());
|
||||
@@ -251,7 +277,7 @@ Radio_Widget::Radio_Widget(QWidget* parent) : Base_Widget(parent) {
|
||||
m6 = create_normal("MSG1\n", font_size);
|
||||
select_value_widget = new Frequent_Shower(this);
|
||||
int n = 5;
|
||||
QVector<double> tick_list(n);
|
||||
std::vector<double> tick_list(n);
|
||||
double space = 100.0 / n;
|
||||
for (int i = 0; i < n; ++i) {
|
||||
tick_list[i] = i * space;
|
||||
@@ -323,7 +349,9 @@ Radio_Widget::Radio_Widget(QWidget* parent) : Base_Widget(parent) {
|
||||
a_h2->addWidget(create_audio_spectrogram_plot(), 4);
|
||||
init_menu();
|
||||
}
|
||||
Radio_Widget::~Radio_Widget() {}
|
||||
Radio_Widget::~Radio_Widget() {
|
||||
Back_End::instance()->stop_mock_thread();
|
||||
}
|
||||
void Radio_Widget::init_menu() {
|
||||
int font_size = 30;
|
||||
auto btn1_1 = new Menu_Button("模式设置", font_size, []() {});
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#include "SweepFrequencyWidget.h"
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QVector>
|
||||
#include <QPainter>
|
||||
#include <QDebug>
|
||||
#include "../component/FrequentShower.h"
|
||||
@@ -49,11 +48,11 @@ QWidget* Sweep_Frequency_Widget::create_spectrogram_power_plot() {
|
||||
}
|
||||
void contextMenuEvent(QContextMenuEvent* event) override {
|
||||
if (!menu) {
|
||||
auto ws =
|
||||
bw(cw(sf.get(), -1), "扫频图") +
|
||||
bw(cw(x_axis.get()), "x轴") +
|
||||
bw(cw(y_axis.get()), "y轴") +
|
||||
bw(cw(msr.get()), "多选框");
|
||||
auto ws = concat_widgets(
|
||||
bw(cw(sf.get(), -1), "扫频图"),
|
||||
bw(cw(x_axis.get()), "x轴"),
|
||||
bw(cw(y_axis.get()), "y轴"),
|
||||
bw(cw(msr.get()), "多选框"));
|
||||
menu = create_menu(this, ws);
|
||||
}
|
||||
menu->exec(event->globalPos());
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "menu/BaseWidgetMenu.h"
|
||||
#include <QScreen>
|
||||
|
||||
QVBoxLayout* create_vbox_layout(const QVector<QWidget*>& children, QWidget *parent){
|
||||
QVBoxLayout* create_vbox_layout(const std::vector<QWidget*>& children, QWidget *parent){
|
||||
auto ret = new QVBoxLayout(parent);
|
||||
ret->setMargin(0);
|
||||
ret->setSpacing(0);
|
||||
@@ -15,7 +15,7 @@ QVBoxLayout* create_vbox_layout(const QVector<QWidget*>& children, QWidget *pare
|
||||
return ret;
|
||||
}
|
||||
|
||||
QHBoxLayout* create_hbox_layout(const QVector<QWidget*>& children, QWidget *parent){
|
||||
QHBoxLayout* create_hbox_layout(const std::vector<QWidget*>& children, QWidget *parent){
|
||||
auto ret = new QHBoxLayout(parent);
|
||||
ret->setMargin(0);
|
||||
ret->setSpacing(0);
|
||||
@@ -42,7 +42,7 @@ QRect get_max_rect(const QRect& rect, double WHRate){
|
||||
}
|
||||
|
||||
|
||||
int calculate_optimal_font_size(const QVector<QString>& text_list, const QSize& space_size, const QFont& font) {
|
||||
int calculate_optimal_font_size(const std::vector<QString>& text_list, const QSize& space_size, const QFont& font) {
|
||||
int font_size = 1, textWidth, textHeight;
|
||||
do {
|
||||
textWidth = -1;
|
||||
|
||||
@@ -8,12 +8,12 @@
|
||||
#include <QKeyEvent>
|
||||
#include <QPainter>
|
||||
#include <QVBoxLayout>
|
||||
#include <QVector>
|
||||
#include <QWidget>
|
||||
#include <QWindow>
|
||||
#include <QtWidgets>
|
||||
#include <QtWidgetsDepends>
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
#include "psc_global_include/Singleton.hpp"
|
||||
class Global : public Psc::Singleton<Global> {
|
||||
public:
|
||||
@@ -21,11 +21,11 @@ public:
|
||||
int adapt_height(int full_screen_height);
|
||||
int adapt_width(int full_screen_width);
|
||||
};
|
||||
QVBoxLayout* create_vbox_layout(const QVector<QWidget*>& children = {}, QWidget* parent = nullptr);
|
||||
QHBoxLayout* create_hbox_layout(const QVector<QWidget*>& children = {}, QWidget* parent = nullptr);
|
||||
QVBoxLayout* create_vbox_layout(const std::vector<QWidget*>& children = {}, QWidget* parent = nullptr);
|
||||
QHBoxLayout* create_hbox_layout(const std::vector<QWidget*>& children = {}, QWidget* parent = nullptr);
|
||||
QRect get_max_rect(const QRect& rect, double WHRate);
|
||||
int calculate_optimal_font_size(const QString& text, const QSize& space_size, const QFont& font);
|
||||
int calculate_optimal_font_size(const QVector<QString>& text_list, const QSize& space_size, const QFont& font);
|
||||
int calculate_optimal_font_size(const std::vector<QString>& text_list, const QSize& space_size, const QFont& font);
|
||||
QPushButton* create_button(const QString& text, int font_size, const std::function<void(void)>& func = nullptr);
|
||||
namespace renderive {
|
||||
template <typename T>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#ifndef Toolbox_Circular_Linked_List_H
|
||||
#define Toolbox_Circular_Linked_List_H
|
||||
|
||||
#include <vector>
|
||||
namespace Toolbox {
|
||||
template<typename T>
|
||||
struct Circular_Linked_List_Node {
|
||||
@@ -12,9 +12,9 @@ namespace Toolbox {
|
||||
public:
|
||||
Circular_Linked_List_Node<T> *head = nullptr;
|
||||
Circular_Linked_List_Node<T> *cur = nullptr;
|
||||
void init(const QVector<T> &data_list) {
|
||||
void init(const std::vector<T> &data_list) {
|
||||
head = new Circular_Linked_List_Node<T>();
|
||||
head->data = data_list.first();
|
||||
head->data = data_list.front();
|
||||
Circular_Linked_List_Node<T> *prev = head;
|
||||
int n = data_list.size();
|
||||
for (int i = 1; i < n - 1; i++) {
|
||||
@@ -25,7 +25,7 @@ namespace Toolbox {
|
||||
prev = node;
|
||||
}
|
||||
auto tail = new Circular_Linked_List_Node<T>();
|
||||
tail->data = data_list.last();
|
||||
tail->data = data_list.back();
|
||||
tail->prev = prev;
|
||||
prev->next = tail;
|
||||
tail->next = head;
|
||||
@@ -66,9 +66,9 @@ namespace Toolbox {
|
||||
node->next = that;
|
||||
that->prev = node;
|
||||
}
|
||||
QVector<Circular_Linked_List_Node<T> *> to_vector() {
|
||||
std::vector<Circular_Linked_List_Node<T> *> to_vector() {
|
||||
if (head == nullptr) return {};
|
||||
QVector<Circular_Linked_List_Node<T> *> ret;
|
||||
std::vector<Circular_Linked_List_Node<T> *> ret;
|
||||
Circular_Linked_List_Node<T> *cur = head;
|
||||
do {
|
||||
ret.push_back(cur);
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#ifndef Toolbox_Node_H
|
||||
#define Toolbox_Node_H
|
||||
#include <QVector>
|
||||
#include <QQueue>
|
||||
#include <algorithm>
|
||||
#include <queue>
|
||||
#include <vector>
|
||||
namespace Toolbox {
|
||||
template<typename That>
|
||||
class Node {
|
||||
@@ -9,37 +10,39 @@ namespace Toolbox {
|
||||
explicit Node() = default;
|
||||
int index() {
|
||||
if (!father) return -1;
|
||||
return father->sons.indexOf(static_cast<That *>(this));
|
||||
auto it = std::find(father->sons.begin(), father->sons.end(), static_cast<That *>(this));
|
||||
if (it == father->sons.end()) return -1;
|
||||
return static_cast<int>(std::distance(father->sons.begin(), it));
|
||||
}
|
||||
bool root() { return !father; }
|
||||
bool leaf() { return sons.empty(); }
|
||||
bool first() {
|
||||
if (!father) return false;
|
||||
return this == father->sons.first();
|
||||
return this == father->sons.front();
|
||||
}
|
||||
bool last() {
|
||||
if (!father) return false;
|
||||
return this == father->sons.last();
|
||||
return this == father->sons.back();
|
||||
}
|
||||
That *previous() {
|
||||
if (!father) return nullptr;
|
||||
int i = father->sons.indexOf(static_cast<That *>(this)) - 1;
|
||||
int i = index() - 1;
|
||||
if (i < 0) return nullptr;
|
||||
return father->sons[i];
|
||||
}
|
||||
That *next() {
|
||||
if (!father) return nullptr;
|
||||
int i = father->sons.indexOf(static_cast<That *>(this)) + 1;
|
||||
if (i > father->sons.buffer_size()) return nullptr;
|
||||
int i = index() + 1;
|
||||
if (i <= 0 || i >= static_cast<int>(father->sons.size())) return nullptr;
|
||||
return father->sons[i];
|
||||
}
|
||||
That *last_child() {
|
||||
if (sons.empty()) return nullptr;
|
||||
return sons.last();
|
||||
return sons.back();
|
||||
}
|
||||
That *first_child() {
|
||||
if (sons.empty()) return nullptr;
|
||||
return sons.first();
|
||||
return sons.front();
|
||||
}
|
||||
That *root_node() {
|
||||
That *ret = static_cast<That *>(this);
|
||||
@@ -50,48 +53,50 @@ namespace Toolbox {
|
||||
}
|
||||
int deep() {
|
||||
That *ret = static_cast<That *>(this);
|
||||
int depth = 0;
|
||||
while (ret->father != nullptr) {
|
||||
ret = ret->father;
|
||||
ret++;
|
||||
depth++;
|
||||
}
|
||||
return ret;
|
||||
return depth;
|
||||
}
|
||||
//遍历值
|
||||
QVector<That *> deep_traversed() {
|
||||
std::vector<That *> deep_traversed() {
|
||||
std::vector<That *> ret;
|
||||
ret.append(static_cast<That *>(this));
|
||||
ret.push_back(static_cast<That *>(this));
|
||||
for (auto &child: sons) {
|
||||
ret.append(child->deep_traversed());
|
||||
std::vector<That *> child_values = child->deep_traversed();
|
||||
ret.insert(ret.end(), child_values.begin(), child_values.end());
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
QVector<That *> sequence_traversed() {
|
||||
QVector<That *> ret;
|
||||
QQueue<That *> que;
|
||||
std::vector<That *> sequence_traversed() {
|
||||
std::vector<That *> ret;
|
||||
std::queue<That *> que;
|
||||
That *that = static_cast<That *>(this);
|
||||
que.enqueue(that);
|
||||
que.push(that);
|
||||
while (!que.empty()) {
|
||||
That *cur = que.dequeue();
|
||||
int n = cur->sons.buffer_size();
|
||||
ret.append(cur);
|
||||
That *cur = que.front();
|
||||
que.pop();
|
||||
int n = static_cast<int>(cur->sons.size());
|
||||
ret.push_back(cur);
|
||||
for (int i = 0; i < n; ++i) {
|
||||
que.enqueue(cur->sons[i]);
|
||||
que.push(cur->sons[i]);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
QVector<That *> descendants() {
|
||||
QVector<That *> &&ret = sequence_traversed();
|
||||
ret.pop_front();
|
||||
std::vector<That *> descendants() {
|
||||
std::vector<That *> ret = sequence_traversed();
|
||||
if (!ret.empty()) ret.erase(ret.begin());
|
||||
return ret;
|
||||
}
|
||||
That *father = nullptr;
|
||||
QVector<That *> sons;
|
||||
std::vector<That *> sons;
|
||||
};
|
||||
template<typename NodeType>
|
||||
class Node_Manager {
|
||||
public:
|
||||
QVector<NodeType *> roots;
|
||||
std::vector<NodeType *> roots;
|
||||
};
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -2,18 +2,21 @@
|
||||
#define Toolbox_Roll_Widget_H
|
||||
#include <QObject>
|
||||
#include <QHBoxLayout>
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
namespace Toolbox {
|
||||
template<typename T>
|
||||
class Roll_Object : QObject {
|
||||
public:
|
||||
explicit Roll_Object(QObject *parent = nullptr) : QObject(parent) {}
|
||||
explicit Roll_Object(QVector<T *> widgets, std::function<void(T *)> enter_func,
|
||||
explicit Roll_Object(std::vector<T *> widgets, std::function<void(T *)> enter_func,
|
||||
std::function<void(T *)> leave_func, QObject *parent) :
|
||||
widgets(std::move(widgets)), enter_func(enter_func), leave_func(leave_func), QObject(parent) {
|
||||
if (enter_func) enter_func(widgets[index]);
|
||||
if (!this->widgets.empty() && enter_func) enter_func(this->widgets[index]);
|
||||
}
|
||||
int index = 0;
|
||||
QVector<T *> widgets;
|
||||
std::vector<T *> widgets;
|
||||
std::function<void(T *)> enter_func;
|
||||
std::function<void(T *)> leave_func;
|
||||
T *cur() {
|
||||
@@ -22,7 +25,9 @@ namespace Toolbox {
|
||||
}
|
||||
void set_cur(T *cur) {
|
||||
if (widgets.empty()) return;
|
||||
int new_index = widgets.indexOf(cur);
|
||||
auto it = std::find(widgets.begin(), widgets.end(), cur);
|
||||
if (it == widgets.end()) return;
|
||||
int new_index = static_cast<int>(std::distance(widgets.begin(), it));
|
||||
if (leave_func) leave_func(widgets[index]);
|
||||
index = new_index;
|
||||
if (enter_func) enter_func(widgets[index]);
|
||||
@@ -32,7 +37,7 @@ namespace Toolbox {
|
||||
if (widgets.empty()) return;
|
||||
if (leave_func) leave_func(widgets[index]);
|
||||
widgets[index]->update();
|
||||
if (widgets.last() != widgets[index]) {
|
||||
if (widgets.back() != widgets[index]) {
|
||||
index++;
|
||||
} else {
|
||||
index = 0;
|
||||
@@ -44,10 +49,10 @@ namespace Toolbox {
|
||||
if (widgets.empty()) return;
|
||||
if (leave_func) leave_func(widgets[index]);
|
||||
widgets[index]->update();
|
||||
if (widgets.first() != widgets[index]) {
|
||||
if (widgets.front() != widgets[index]) {
|
||||
index--;
|
||||
} else {
|
||||
index = widgets.size() - 1;
|
||||
index = static_cast<int>(widgets.size()) - 1;
|
||||
}
|
||||
if (enter_func) enter_func(widgets[index]);
|
||||
widgets[index]->update();
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "FileFolderBar.h"
|
||||
#include <QPainter>
|
||||
#include <queue>
|
||||
namespace Toolbox {
|
||||
File_Folder_Bar::File_Folder_Bar(QWidget *parent) : QWidget(parent) {
|
||||
//setAttribute(Qt::WA_OpaquePaintEvent);
|
||||
@@ -19,17 +20,18 @@ namespace Toolbox {
|
||||
QPainter painter(this);
|
||||
int index = 0;
|
||||
for (File_Folder *&root: roots) {
|
||||
QQueue<File_Folder *> que;
|
||||
std::queue<File_Folder *> que;
|
||||
root->deep = 0;
|
||||
que.enqueue(root);
|
||||
que.push(root);
|
||||
while (!que.empty()) {
|
||||
File_Folder *cur = que.dequeue();
|
||||
File_Folder *cur = que.front();
|
||||
que.pop();
|
||||
int n = cur->sons.size();
|
||||
cur->draw(index++, &painter);
|
||||
for (int i = 0; i < n; ++i) {
|
||||
if (cur->is_show_sons) {
|
||||
cur->sons[i]->deep = cur->deep + 1;
|
||||
que.enqueue(cur->sons[i]);
|
||||
que.push(cur->sons[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,21 @@
|
||||
#include "ProgressBar.h"
|
||||
#include <QPainter>
|
||||
#include <QMetaObject>
|
||||
#include <QThread>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
|
||||
Progress_Bar::Progress_Bar(const QVector<Tick>& tick_list, QWidget *parent) : QWidget(parent), tick_list(tick_list) {
|
||||
Progress_Bar::Progress_Bar(const std::vector<Tick>& tick_list, QWidget *parent) : QWidget(parent), tick_list(tick_list) {
|
||||
setAttribute(Qt::WA_OpaquePaintEvent, true);
|
||||
timer = startTimer(30);
|
||||
}
|
||||
|
||||
double Progress_Bar::get_draw_width(double value) {
|
||||
int n = tick_list.size();
|
||||
if (n < 2 || QWidget::width() <= 0)
|
||||
return 0.0;
|
||||
if (!std::isfinite(value))
|
||||
value = tick_list.front().value;
|
||||
int i = 1;
|
||||
for(; i < n - 1; ++i) {
|
||||
double cur = tick_list[i].value;
|
||||
@@ -20,21 +28,28 @@ double Progress_Bar::get_draw_width(double value) {
|
||||
double lower = tick_list[lower_offset].value;
|
||||
double upper = tick_list[upper_offset].value;
|
||||
double w_step = (double)QWidget::width()/(double)(n-1);
|
||||
double last_rate = qMax(0.0, (value - lower)/(upper - lower));
|
||||
double last_rate = upper == lower ? 0.0 : (value - lower)/(upper - lower);
|
||||
last_rate = std::clamp(last_rate, 0.0, 1.0);
|
||||
double draw_width = w_step * (last_rate + lower_offset);
|
||||
QString ticks;
|
||||
for(Tick& tick : tick_list) {
|
||||
ticks.append(" " + QString::number(tick.value));
|
||||
}
|
||||
// qDebug() << QString("%1->[%2,%3] i=%4 n=%5 draw_width:%6 width:%7 ticks:%8 w_step:%9 last_rate:%10")
|
||||
// .arg(value).arg(lower).arg(upper).arg(i).arg(n).arg(draw_width).arg(width()).arg(ticks)
|
||||
// .arg(w_step).arg(last_rate);
|
||||
return draw_width;
|
||||
return std::clamp(draw_width, 0.0, (double)QWidget::width());
|
||||
}
|
||||
void Progress_Bar::setValue(double value) {
|
||||
if (thread() != QThread::currentThread()) {
|
||||
queued_value.store(value, std::memory_order_release);
|
||||
if (!queued_value_update.exchange(true, std::memory_order_acq_rel)) {
|
||||
QMetaObject::invokeMethod(this, [this]() {
|
||||
double value = queued_value.load(std::memory_order_acquire);
|
||||
queued_value_update.store(false, std::memory_order_release);
|
||||
setValue(value);
|
||||
}, Qt::QueuedConnection);
|
||||
}
|
||||
return;
|
||||
}
|
||||
this->value = value;
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Progress_Bar::paintEvent(QPaintEvent *event) {
|
||||
Q_UNUSED(event)
|
||||
QPainter painter(this);
|
||||
painter.setPen(Qt::NoPen);
|
||||
painter.fillRect(rect(), QApplication::style()->standardPalette().brush(QPalette::Window));
|
||||
@@ -44,18 +59,19 @@ void Progress_Bar::paintEvent(QPaintEvent *event) {
|
||||
int n = tick_list.size();
|
||||
int tick_w = 1;
|
||||
double draw_width = get_draw_width(value);
|
||||
// 背景
|
||||
painter.fillRect(0, 0, draw_width - tick_w - 4, height()/2, Qt::black);
|
||||
int fill_width = std::max(0, static_cast<int>(draw_width) - tick_w - 4);
|
||||
if (fill_width > 0)
|
||||
painter.fillRect(0, 0, fill_width, height()/2, Qt::black);
|
||||
int cur_x = 0;
|
||||
// 进度条
|
||||
int tick_step = std::max(1, tick_w + (int)tick_space_w);
|
||||
while(cur_x + tick_w + 4 < draw_width){
|
||||
painter.fillRect(cur_x, 0, tick_w, height()/2, Qt::gray);
|
||||
cur_x += tick_w + (int)tick_space_w;
|
||||
cur_x += tick_step;
|
||||
}
|
||||
int line_y = (int)hh + 2;
|
||||
painter.fillRect(cur_x -(int)tick_space_w , 0, 4, line_y - 0, Qt::yellow);
|
||||
int marker_x = std::clamp(cur_x - (int)tick_space_w, 0, std::max(0, QWidget::width() - 4));
|
||||
painter.fillRect(marker_x, 0, 4, line_y, Qt::yellow);
|
||||
painter.drawLine(0, line_y , (int)w, line_y);
|
||||
// 画刻度
|
||||
QFont font;
|
||||
font.setBold(true);
|
||||
QFontMetrics fm(font);
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#ifndef Progress_Bar_H
|
||||
#define Progress_Bar_H
|
||||
#include <utility>
|
||||
|
||||
#include <vector>
|
||||
#include <atomic>
|
||||
#include "../Global.h"
|
||||
|
||||
struct Tick{
|
||||
@@ -12,24 +13,26 @@ struct Tick{
|
||||
QString that = (text[0] == '+' || text[0] == '-' || text[0] == '<' || text[0] == '>') ? text.mid(1) : text;
|
||||
value = that.toDouble();
|
||||
}
|
||||
Tick(QString text, QColor color, double value) : text(std::move(text)), color(std::move(color)){
|
||||
value = value;
|
||||
Tick(QString text, QColor color, double value) : text(std::move(text)), color(std::move(color)), value(value){
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class Progress_Bar : public QWidget {
|
||||
public:
|
||||
explicit Progress_Bar(const QVector<Tick>& tick_list, QWidget *parent = nullptr);
|
||||
explicit Progress_Bar(const std::vector<Tick>& tick_list, QWidget *parent = nullptr);
|
||||
double tick_space_w = 1;
|
||||
double value = 0;
|
||||
int timer;
|
||||
std::function<void(void)> set_value = nullptr;
|
||||
std::atomic_bool queued_value_update{false};
|
||||
std::atomic<double> queued_value{0.0};
|
||||
double get_draw_width(double value);
|
||||
void setValue(double value);
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *event) override;
|
||||
void timerEvent(QTimerEvent *event) override;
|
||||
QVector<Tick> tick_list;
|
||||
std::vector<Tick> tick_list;
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ void Base_Widget_Menu::showEvent(QShowEvent *event) {
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void Base_Widget_Menu::add_menu_button_on_layout1(const QVector<Abstract_Menu_Button *>& buttons, int stretch) {
|
||||
void Base_Widget_Menu::add_menu_button_on_layout1(const std::vector<Abstract_Menu_Button *>& buttons, int stretch) {
|
||||
for(Abstract_Menu_Button* btn : buttons){
|
||||
first_layout->addWidget(btn, 1);
|
||||
roll_object.widgets.push_back(btn);
|
||||
@@ -58,7 +58,7 @@ void Base_Widget_Menu::add_menu_button_on_layout1(const QVector<Abstract_Menu_Bu
|
||||
};
|
||||
}
|
||||
|
||||
void Base_Widget_Menu::add_menu_button_on_layout2(const QVector<Abstract_Menu_Button *>& buttons, int stretch) {
|
||||
void Base_Widget_Menu::add_menu_button_on_layout2(const std::vector<Abstract_Menu_Button *>& buttons, int stretch) {
|
||||
for(Abstract_Menu_Button* btn : buttons){
|
||||
second_layout->addWidget(btn, 1);
|
||||
roll_object.widgets.push_back(btn);
|
||||
@@ -71,11 +71,11 @@ void Base_Widget_Menu::add_menu_button_on_layout2(const QVector<Abstract_Menu_Bu
|
||||
};
|
||||
}
|
||||
|
||||
void Base_Widget_Menu::add_menu_button_on_layout1(const QVector<Abstract_Menu_Button *>& buttons) {
|
||||
void Base_Widget_Menu::add_menu_button_on_layout1(const std::vector<Abstract_Menu_Button *>& buttons) {
|
||||
add_menu_button_on_layout1(buttons, 5 - buttons.size());
|
||||
}
|
||||
|
||||
void Base_Widget_Menu::add_menu_button_on_layout2(const QVector<Abstract_Menu_Button *>& buttons) {
|
||||
void Base_Widget_Menu::add_menu_button_on_layout2(const std::vector<Abstract_Menu_Button *>& buttons) {
|
||||
add_menu_button_on_layout2(buttons, 5 - buttons.size());
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#ifndef Base_Widget_Menu_H
|
||||
#define Base_Widget_Menu_H
|
||||
#include "Renderive/export.h"
|
||||
#include <QMap>
|
||||
#include <QPushButton>
|
||||
#include <QWidget>
|
||||
#include <vector>
|
||||
#include "Widget/base/Node.hpp"
|
||||
#include "Widget/base/Roll_Object.h"
|
||||
class QHBoxLayout;
|
||||
@@ -22,10 +22,10 @@ public:
|
||||
Base_Widget_Menu* create_sub_widget_menu(Abstract_Menu_Button* btn);
|
||||
void esc(Base_Widget_Menu* menu);
|
||||
void confirm();
|
||||
void add_menu_button_on_layout1(const QVector<Abstract_Menu_Button*>& buttons, int stretch);
|
||||
void add_menu_button_on_layout2(const QVector<Abstract_Menu_Button*>& buttons, int stretch);
|
||||
void add_menu_button_on_layout1(const QVector<Abstract_Menu_Button*>& buttons);
|
||||
void add_menu_button_on_layout2(const QVector<Abstract_Menu_Button*>& buttons);
|
||||
void add_menu_button_on_layout1(const std::vector<Abstract_Menu_Button*>& buttons, int stretch);
|
||||
void add_menu_button_on_layout2(const std::vector<Abstract_Menu_Button*>& buttons, int stretch);
|
||||
void add_menu_button_on_layout1(const std::vector<Abstract_Menu_Button*>& buttons);
|
||||
void add_menu_button_on_layout2(const std::vector<Abstract_Menu_Button*>& buttons);
|
||||
signals :
|
||||
|
||||
void show_that();
|
||||
|
||||
Reference in New Issue
Block a user