From: Steinar H. Gunderson Date: Sun, 14 May 2017 10:43:26 +0000 (+0200) Subject: Support automatically grabbing frames at regular intervals in the analyzer. X-Git-Tag: 1.6.0~20 X-Git-Url: https://git.sesse.net/?p=nageru;a=commitdiff_plain;h=fb2aaebcd1a1e5b9ba23a714fa7fc39788f670ab Support automatically grabbing frames at regular intervals in the analyzer. --- diff --git a/analyzer.cpp b/analyzer.cpp index e61e488..cca3133 100644 --- a/analyzer.cpp +++ b/analyzer.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -36,7 +37,15 @@ Analyzer::Analyzer() { ui->setupUi(this); - //connect(ui->button_box, &QDialogButtonBox::accepted, [this]{ this->close(); }); + surface = create_surface(QSurfaceFormat::defaultFormat()); + context = create_context(surface); + if (!make_current(context, surface)) { + printf("oops\n"); + exit(1); + } + + grab_timer.setSingleShot(true); + connect(&grab_timer, &QTimer::timeout, bind(&Analyzer::grab_clicked, this)); ui->input_box->addItem("Live", Mixer::OUTPUT_LIVE); ui->input_box->addItem("Preview", Mixer::OUTPUT_PREVIEW); @@ -47,19 +56,17 @@ Analyzer::Analyzer() ui->input_box->addItem(QString::fromStdString(name), channel); } + ui->grab_frequency_box->addItem("Never", 0); + ui->grab_frequency_box->addItem("100 ms", 100); + ui->grab_frequency_box->addItem("1 sec", 1000); + ui->grab_frequency_box->addItem("10 sec", 10000); + ui->grab_frequency_box->setCurrentIndex(2); + connect(ui->grab_btn, &QPushButton::clicked, bind(&Analyzer::grab_clicked, this)); connect(ui->input_box, static_cast(&QComboBox::currentIndexChanged), bind(&Analyzer::signal_changed, this)); signal_changed(); ui->grabbed_frame_label->installEventFilter(this); - surface = create_surface(QSurfaceFormat::defaultFormat()); - context = create_context(surface); - - if (!make_current(context, surface)) { - printf("oops\n"); - exit(1); - } - glGenBuffers(1, &pbo); glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, pbo); glBufferData(GL_PIXEL_PACK_BUFFER_ARB, global_flags.width * global_flags.height * 4, NULL, GL_STREAM_READ); @@ -216,42 +223,71 @@ void Analyzer::grab_clicked() check_error(); resource_pool->release_fbo(fbo); check_error(); + + if (last_x >= 0 && last_y >= 0) { + grab_pixel(last_x, last_y); + } + + if (isVisible()) { + grab_timer.stop(); + + // Set up the next autograb if configured. + int delay = ui->grab_frequency_box->currentData().toInt(nullptr); + if (delay > 0) { + grab_timer.start(delay); + } + } } void Analyzer::signal_changed() { Mixer::Output channel = static_cast(ui->input_box->currentData().value()); ui->display->set_output(channel); + grab_clicked(); } bool Analyzer::eventFilter(QObject *watched, QEvent *event) { - if (event->type() == QEvent::MouseMove && - watched->isWidgetType()) { + if (event->type() == QEvent::MouseMove && watched->isWidgetType()) { const QMouseEvent *mouse_event = (QMouseEvent *)event; - const QPixmap *pixmap = ui->grabbed_frame_label->pixmap(); - if (pixmap != nullptr) { - int x = lrint(mouse_event->x() * double(pixmap->width()) / ui->grabbed_frame_label->width()); - int y = lrint(mouse_event->y() * double(pixmap->height()) / ui->grabbed_frame_label->height()); - x = std::min(x, pixmap->width() - 1); - y = std::min(y, pixmap->height() - 1); - - char buf[256]; - snprintf(buf, sizeof(buf), "Selected coordinate (x,y): (%d,%d)", x, y); - ui->coord_label->setText(buf); - - QRgb pixel = grabbed_image.pixel(x, y); - ui->red_label->setText(QString::fromStdString(to_string(qRed(pixel)))); - ui->green_label->setText(QString::fromStdString(to_string(qGreen(pixel)))); - ui->blue_label->setText(QString::fromStdString(to_string(qBlue(pixel)))); - - snprintf(buf, sizeof(buf), "#%02x%02x%02x", qRed(pixel), qGreen(pixel), qBlue(pixel)); - ui->hex_label->setText(buf); - } - } + last_x = mouse_event->x(); + last_y = mouse_event->y(); + grab_pixel(mouse_event->x(), mouse_event->y()); + } + if (event->type() == QEvent::Leave && watched->isWidgetType()) { + last_x = last_y = -1; + ui->coord_label->setText("Selected coordinate (x,y): (none)"); + ui->red_label->setText(u8"—"); + ui->green_label->setText(u8"—"); + ui->blue_label->setText(u8"—"); + ui->hex_label->setText(u8"#—"); + } return false; } +void Analyzer::grab_pixel(int x, int y) +{ + const QPixmap *pixmap = ui->grabbed_frame_label->pixmap(); + if (pixmap != nullptr) { + x = lrint(x * double(pixmap->width()) / ui->grabbed_frame_label->width()); + y = lrint(y * double(pixmap->height()) / ui->grabbed_frame_label->height()); + x = std::min(x, pixmap->width() - 1); + y = std::min(y, pixmap->height() - 1); + + char buf[256]; + snprintf(buf, sizeof(buf), "Selected coordinate (x,y): (%d,%d)", x, y); + ui->coord_label->setText(buf); + + QRgb pixel = grabbed_image.pixel(x, y); + ui->red_label->setText(QString::fromStdString(to_string(qRed(pixel)))); + ui->green_label->setText(QString::fromStdString(to_string(qGreen(pixel)))); + ui->blue_label->setText(QString::fromStdString(to_string(qBlue(pixel)))); + + snprintf(buf, sizeof(buf), "#%02x%02x%02x", qRed(pixel), qGreen(pixel), qBlue(pixel)); + ui->hex_label->setText(buf); + } +} + void Analyzer::resizeEvent(QResizeEvent* event) { QMainWindow::resizeEvent(event); @@ -261,6 +297,11 @@ void Analyzer::resizeEvent(QResizeEvent* event) QMetaObject::invokeMethod(this, "relayout", Qt::QueuedConnection); } +void Analyzer::showEvent(QShowEvent *event) +{ + grab_clicked(); +} + void Analyzer::relayout() { double aspect = double(global_flags.width) / global_flags.height; @@ -273,11 +314,14 @@ void Analyzer::relayout() // Figure out how much space everything that's non-responsive needs. int remaining_height = height - ui->left_pane->spacing() * (ui->left_pane->count() - 1); - remaining_height -= ui->grab_btn->geometry().height(); + remaining_height -= ui->input_box->geometry().height(); ui->left_pane->setStretch(2, ui->grab_btn->geometry().height()); + remaining_height -= ui->grab_btn->geometry().height(); + ui->left_pane->setStretch(3, ui->grab_btn->geometry().height()); + remaining_height -= ui->histogram_label->geometry().height(); - ui->left_pane->setStretch(4, ui->histogram_label->geometry().height()); + ui->left_pane->setStretch(5, ui->histogram_label->geometry().height()); // The histogram's minimumHeight returns 0, so let's set a reasonable minimum for it. int min_histogram_height = 50; @@ -309,10 +353,10 @@ void Analyzer::relayout() histogram_height = remaining_height; } remaining_height -= histogram_height; - ui->left_pane->setStretch(3, histogram_height); + ui->left_pane->setStretch(4, histogram_height); ui->left_pane->setStretch(0, remaining_height / 2); - ui->left_pane->setStretch(5, remaining_height / 2); + ui->left_pane->setStretch(6, remaining_height / 2); } // Right pane (remaining 3/5 of the width). diff --git a/analyzer.h b/analyzer.h index 71c0612..b5aad15 100644 --- a/analyzer.h +++ b/analyzer.h @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -39,8 +40,10 @@ public slots: private: void grab_clicked(); void signal_changed(); + void grab_pixel(int x, int y); bool eventFilter(QObject *watched, QEvent *event) override; void resizeEvent(QResizeEvent *event) override; + void showEvent(QShowEvent *event) override; Ui::Analyzer *ui; QSurface *surface; @@ -48,6 +51,8 @@ private: GLuint pbo; movit::ResourcePool *resource_pool = nullptr; QImage grabbed_image; + QTimer grab_timer; + int last_x = -1, last_y = -1; }; #endif // !defined(_ANALYZER_H) diff --git a/ui_analyzer.ui b/ui_analyzer.ui index 15e8e79..b509cf1 100644 --- a/ui_analyzer.ui +++ b/ui_analyzer.ui @@ -7,7 +7,7 @@ 0 0 845 - 456 + 472 @@ -16,7 +16,7 @@ - + @@ -54,7 +54,7 @@ true - true + false background: rgb(233, 185, 110) @@ -77,10 +77,24 @@ - + + + + + + + + + Grab every: + + + + + + @@ -264,14 +278,14 @@ - 127 + — - 127 + — @@ -285,7 +299,7 @@ - 127 + — @@ -299,7 +313,7 @@ - #7f7f7f + #—