forked from mia/Aegisub
Add lua bindings for open and save standard dialogs
Originally committed to SVN as r6499.
This commit is contained in:
parent
048fc44cfa
commit
b59b3c56fc
4 changed files with 116 additions and 3 deletions
|
@ -55,6 +55,12 @@
|
||||||
#include <wx/tokenzr.h>
|
#include <wx/tokenzr.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <tuple>
|
||||||
|
#else
|
||||||
|
#include <tr1/tuple>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef __WINDOWS__
|
#ifndef __WINDOWS__
|
||||||
#include <ft2build.h>
|
#include <ft2build.h>
|
||||||
#include FT_FREETYPE_H
|
#include FT_FREETYPE_H
|
||||||
|
@ -230,6 +236,7 @@ namespace Automation4 {
|
||||||
|
|
||||||
// ProgressSink
|
// ProgressSink
|
||||||
wxDEFINE_EVENT(EVT_SHOW_DIALOG, wxThreadEvent);
|
wxDEFINE_EVENT(EVT_SHOW_DIALOG, wxThreadEvent);
|
||||||
|
wxDEFINE_EVENT(EVT_SHOW_SCRIPT_DIALOG, wxThreadEvent);
|
||||||
|
|
||||||
ProgressSink::ProgressSink(agi::ProgressSink *impl, BackgroundScriptRunner *bsr)
|
ProgressSink::ProgressSink(agi::ProgressSink *impl, BackgroundScriptRunner *bsr)
|
||||||
: impl(impl)
|
: impl(impl)
|
||||||
|
@ -241,23 +248,35 @@ namespace Automation4 {
|
||||||
void ProgressSink::ShowDialog(ScriptDialog *config_dialog)
|
void ProgressSink::ShowDialog(ScriptDialog *config_dialog)
|
||||||
{
|
{
|
||||||
wxSemaphore sema(0, 1);
|
wxSemaphore sema(0, 1);
|
||||||
wxThreadEvent *evt = new wxThreadEvent(EVT_SHOW_DIALOG);
|
wxThreadEvent *evt = new wxThreadEvent(EVT_SHOW_SCRIPT_DIALOG);
|
||||||
evt->SetPayload(std::make_pair(config_dialog, &sema));
|
evt->SetPayload(std::make_pair(config_dialog, &sema));
|
||||||
bsr->QueueEvent(evt);
|
bsr->QueueEvent(evt);
|
||||||
sema.Wait();
|
sema.Wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ProgressSink::ShowDialog(wxDialog *dialog)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
wxSemaphore sema(0, 1);
|
||||||
|
wxThreadEvent *evt = new wxThreadEvent(EVT_SHOW_DIALOG);
|
||||||
|
evt->SetPayload(std::tr1::make_tuple(dialog, &sema, &ret));
|
||||||
|
bsr->QueueEvent(evt);
|
||||||
|
sema.Wait();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
BackgroundScriptRunner::BackgroundScriptRunner(wxWindow *parent, wxString const& title)
|
BackgroundScriptRunner::BackgroundScriptRunner(wxWindow *parent, wxString const& title)
|
||||||
: impl(new DialogProgress(parent, title))
|
: impl(new DialogProgress(parent, title))
|
||||||
{
|
{
|
||||||
impl->Bind(EVT_SHOW_DIALOG, &BackgroundScriptRunner::OnDialog, this);
|
impl->Bind(EVT_SHOW_DIALOG, &BackgroundScriptRunner::OnDialog, this);
|
||||||
|
impl->Bind(EVT_SHOW_SCRIPT_DIALOG, &BackgroundScriptRunner::OnScriptDialog, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
BackgroundScriptRunner::~BackgroundScriptRunner()
|
BackgroundScriptRunner::~BackgroundScriptRunner()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackgroundScriptRunner::OnDialog(wxThreadEvent &evt)
|
void BackgroundScriptRunner::OnScriptDialog(wxThreadEvent &evt)
|
||||||
{
|
{
|
||||||
std::pair<ScriptDialog*, wxSemaphore*> payload = evt.GetPayload<std::pair<ScriptDialog*, wxSemaphore*> >();
|
std::pair<ScriptDialog*, wxSemaphore*> payload = evt.GetPayload<std::pair<ScriptDialog*, wxSemaphore*> >();
|
||||||
|
|
||||||
|
@ -274,7 +293,16 @@ namespace Automation4 {
|
||||||
payload.second->Post();
|
payload.second->Post();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackgroundScriptRunner::QueueEvent(wxEvent *evt) {
|
void BackgroundScriptRunner::OnDialog(wxThreadEvent &evt)
|
||||||
|
{
|
||||||
|
using namespace std::tr1;
|
||||||
|
tuple<wxDialog*, wxSemaphore*, int*> payload = evt.GetPayload<tuple<wxDialog*, wxSemaphore*, int*> >();
|
||||||
|
*get<2>(payload) = get<0>(payload)->ShowModal();
|
||||||
|
get<1>(payload)->Post();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackgroundScriptRunner::QueueEvent(wxEvent *evt)
|
||||||
|
{
|
||||||
wxQueueEvent(impl.get(), evt);
|
wxQueueEvent(impl.get(), evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,6 +325,11 @@ namespace Automation4 {
|
||||||
impl->Run(bind(progress_sink_wrapper, task, std::tr1::placeholders::_1, this), prio);
|
impl->Run(bind(progress_sink_wrapper, task, std::tr1::placeholders::_1, this), prio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxWindow *BackgroundScriptRunner::GetParentWindow() const
|
||||||
|
{
|
||||||
|
return impl.get();
|
||||||
|
}
|
||||||
|
|
||||||
// Script
|
// Script
|
||||||
Script::Script(wxString const& filename)
|
Script::Script(wxString const& filename)
|
||||||
: filename(filename)
|
: filename(filename)
|
||||||
|
|
|
@ -131,8 +131,10 @@ namespace Automation4 {
|
||||||
agi::scoped_ptr<DialogProgress> impl;
|
agi::scoped_ptr<DialogProgress> impl;
|
||||||
|
|
||||||
void OnDialog(wxThreadEvent &evt);
|
void OnDialog(wxThreadEvent &evt);
|
||||||
|
void OnScriptDialog(wxThreadEvent &evt);
|
||||||
public:
|
public:
|
||||||
void QueueEvent(wxEvent *evt);
|
void QueueEvent(wxEvent *evt);
|
||||||
|
wxWindow *GetParentWindow() const;
|
||||||
|
|
||||||
void Run(std::tr1::function<void(ProgressSink*)> task);
|
void Run(std::tr1::function<void(ProgressSink*)> task);
|
||||||
|
|
||||||
|
@ -157,6 +159,8 @@ namespace Automation4 {
|
||||||
/// Show the passed dialog on the GUI thread, blocking the calling
|
/// Show the passed dialog on the GUI thread, blocking the calling
|
||||||
/// thread until it closes
|
/// thread until it closes
|
||||||
void ShowDialog(ScriptDialog *config_dialog);
|
void ShowDialog(ScriptDialog *config_dialog);
|
||||||
|
int ShowDialog(wxDialog *dialog);
|
||||||
|
wxWindow *GetParentWindow() const { return bsr->GetParentWindow(); }
|
||||||
|
|
||||||
/// Get the current automation trace level
|
/// Get the current automation trace level
|
||||||
int GetTraceLevel() const { return trace_level; }
|
int GetTraceLevel() const { return trace_level; }
|
||||||
|
|
|
@ -145,6 +145,8 @@ namespace Automation4 {
|
||||||
static int LuaGetCancelled(lua_State *L);
|
static int LuaGetCancelled(lua_State *L);
|
||||||
static int LuaDebugOut(lua_State *L);
|
static int LuaDebugOut(lua_State *L);
|
||||||
static int LuaDisplayDialog(lua_State *L);
|
static int LuaDisplayDialog(lua_State *L);
|
||||||
|
static int LuaDisplayOpenDialog(lua_State *L);
|
||||||
|
static int LuaDisplaySaveDialog(lua_State *L);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LuaProgressSink(lua_State *L, ProgressSink *ps, bool allow_config_dialog = true);
|
LuaProgressSink(lua_State *L, ProgressSink *ps, bool allow_config_dialog = true);
|
||||||
|
|
|
@ -60,6 +60,16 @@ namespace {
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
lua_setfield(L, idx, name);
|
lua_setfield(L, idx, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline wxString get_wxstring(lua_State *L, int idx)
|
||||||
|
{
|
||||||
|
return wxString(lua_tostring(L, idx), wxConvUTF8);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline wxString check_wxstring(lua_State *L, int idx)
|
||||||
|
{
|
||||||
|
return wxString(luaL_checkstring(L, idx), wxConvUTF8);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Automation4 {
|
namespace Automation4 {
|
||||||
|
@ -91,6 +101,8 @@ namespace Automation4 {
|
||||||
if (allow_config_dialog) {
|
if (allow_config_dialog) {
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
set_field_to_closure(L, "display", LuaDisplayDialog);
|
set_field_to_closure(L, "display", LuaDisplayDialog);
|
||||||
|
set_field_to_closure(L, "open", LuaDisplayOpenDialog);
|
||||||
|
set_field_to_closure(L, "save", LuaDisplaySaveDialog);
|
||||||
lua_setfield(L, -2, "dialog");
|
lua_setfield(L, -2, "dialog");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,6 +203,68 @@ namespace Automation4 {
|
||||||
// more magic: puts two values on stack: button pushed and table with control results
|
// more magic: puts two values on stack: button pushed and table with control results
|
||||||
return dlg.LuaReadBack(L);
|
return dlg.LuaReadBack(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int LuaProgressSink::LuaDisplayOpenDialog(lua_State *L)
|
||||||
|
{
|
||||||
|
ProgressSink *ps = GetObjPointer(L, lua_upvalueindex(1));
|
||||||
|
wxString message(check_wxstring(L, 1));
|
||||||
|
wxString dir(check_wxstring(L, 2));
|
||||||
|
wxString file(check_wxstring(L, 3));
|
||||||
|
wxString wildcard(check_wxstring(L, 4));
|
||||||
|
bool multiple = !!lua_toboolean(L, 5);
|
||||||
|
bool must_exist = lua_toboolean(L, 6) || lua_isnil(L, 6);
|
||||||
|
|
||||||
|
int flags = wxFD_OPEN;
|
||||||
|
if (multiple)
|
||||||
|
flags |= wxFD_MULTIPLE;
|
||||||
|
if (must_exist)
|
||||||
|
flags |= wxFD_FILE_MUST_EXIST;
|
||||||
|
|
||||||
|
wxFileDialog diag(0, message, dir, file, wildcard, flags);
|
||||||
|
if (ps->ShowDialog(&diag) == wxID_CANCEL) {
|
||||||
|
lua_pushnil(L);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (multiple) {
|
||||||
|
wxArrayString files;
|
||||||
|
diag.GetFilenames(files);
|
||||||
|
|
||||||
|
lua_newtable(L);
|
||||||
|
for (size_t i = 0; i < files.size(); ++i) {
|
||||||
|
lua_pushstring(L, files[i].utf8_str());
|
||||||
|
lua_rawseti(L, -2, i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_pushstring(L, diag.GetFilename().utf8_str());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaProgressSink::LuaDisplaySaveDialog(lua_State *L)
|
||||||
|
{
|
||||||
|
ProgressSink *ps = GetObjPointer(L, lua_upvalueindex(1));
|
||||||
|
wxString message(check_wxstring(L, 1));
|
||||||
|
wxString dir(check_wxstring(L, 2));
|
||||||
|
wxString file(check_wxstring(L, 3));
|
||||||
|
wxString wildcard(check_wxstring(L, 4));
|
||||||
|
bool prompt_overwrite = !lua_toboolean(L, 5);
|
||||||
|
|
||||||
|
int flags = wxFD_SAVE;
|
||||||
|
if (prompt_overwrite)
|
||||||
|
flags |= wxFD_OVERWRITE_PROMPT;
|
||||||
|
|
||||||
|
wxFileDialog diag(ps->GetParentWindow(), message, dir, file, wildcard, flags);
|
||||||
|
if (ps->ShowDialog(&diag) == wxID_CANCEL) {
|
||||||
|
lua_pushnil(L);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_pushstring(L, diag.GetFilename().utf8_str());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue