MPV: quick setup for load file menu action

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2022-01-25 13:29:13 +00:00
parent 975e722a10
commit 3c9a597f7f
No known key found for this signature in database
GPG key ID: CDBAA37ABC74FBA0
3 changed files with 60 additions and 2 deletions

View file

@ -208,6 +208,15 @@ void EmbedWidget::hide()
pData->hide();
}
uintptr_t EmbedWidget::getNativeWindowId() const
{
#ifdef HAVE_X11
return pData->window;
#else
return 0;
#endif
}
void EmbedWidget::step()
{
pData->step(getAbsoluteRect());

View file

@ -29,6 +29,8 @@ struct EmbedWidget : Widget {
void embedIntoRack(uintptr_t nativeWindowId);
void hide();
uintptr_t getNativeWindowId() const;
private:
void draw(const DrawArgs&) override {}
void step() override;

View file

@ -16,9 +16,9 @@
*/
#include "plugincontext.hpp"
#ifndef HEADLESS
# include "EmbedWidget.hpp"
# include "extra/ExternalWindow.hpp"
#endif
// --------------------------------------------------------------------------------------------------------------------
@ -54,7 +54,7 @@ struct CardinalEmbedModule : Module {
// --------------------------------------------------------------------------------------------------------------------
#ifndef HEADLESS
struct CardinalEmbedWidget : ModuleWidget {
struct CardinalEmbedWidget : ModuleWidget, ExternalWindow {
CardinalEmbedModule* const module;
CardinalPluginContext* const pcontext;
EmbedWidget* embedWidget = nullptr;
@ -62,6 +62,7 @@ struct CardinalEmbedWidget : ModuleWidget {
CardinalEmbedWidget(CardinalEmbedModule* const m)
: ModuleWidget(),
ExternalWindow(),
module(m),
pcontext(m != nullptr ? m->pcontext : nullptr)
{
@ -75,6 +76,11 @@ struct CardinalEmbedWidget : ModuleWidget {
}
}
~CardinalEmbedWidget()
{
terminateAndWaitForExternalProcess();
}
void onContextCreate(const ContextCreateEvent& e) override
{
ModuleWidget::onContextCreate(e);
@ -121,6 +127,47 @@ struct CardinalEmbedWidget : ModuleWidget {
isEmbed = false;
embedWidget->hide();
}
void appendContextMenu(ui::Menu* const menu) override
{
menu->addChild(new ui::MenuSeparator);
struct LoadVideoFileItem : MenuItem {
CardinalEmbedWidget* const self;
LoadVideoFileItem(CardinalEmbedWidget* const s)
: self(s)
{
text = "Load video file...";
}
void onAction(const event::Action&) override
{
WeakPtr<CardinalEmbedWidget> const self = this->self;
async_dialog_filebrowser(false, nullptr, text.c_str(), [self](char* path)
{
if (path == nullptr)
return;
if (self != nullptr)
{
char winIdStr[64];
std::snprintf(winIdStr, sizeof(winIdStr), "--wid=%lu",
static_cast<ulong>(self->embedWidget->getNativeWindowId()));
const char* args[] = {
"mpv", "--no-audio", winIdStr, path, nullptr
};
self->terminateAndWaitForExternalProcess();
self->startExternalProcess(args);
}
std::free(path);
});
}
};
menu->addChild(new LoadVideoFileItem(this));
}
};
#else
typedef ModuleWidget CardinalEmbedWidget;