switch move/swap tracks, add mv trk shortcut, update msg
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / shbtnprefs.C
index 5d719beb7c91486af8735ab973c1ca70392424d3..e8e44b0beeb9bcd5790e314961b38122edd44955 100644 (file)
@@ -1,8 +1,13 @@
 #include "bcwindowbase.h"
 #include "bcdisplayinfo.h"
 #include "bcdialog.h"
+#include "awindow.h"
+#include "awindowgui.h"
+#include "cstrdup.h"
+#include "indexable.h"
 #include "language.h"
 #include "mainerror.h"
+#include "mainsession.h"
 #include "mwindow.h"
 #include "shbtnprefs.h"
 #include "preferences.h"
 ShBtnRun::ShBtnRun(const char *nm, const char *cmds, int warn)
  : Thread(0, 0, 1)
 {
+       argv.set_array_delete();
        strncpy(name, nm, sizeof(name)-1);
        name[sizeof(name)-1] = 0;
        strncpy(commands, cmds, sizeof(commands)-1);
        commands[sizeof(commands)-1] = 0;
        this->warn = warn;
-       start();
+}
+ShBtnRun::~ShBtnRun()
+{
+       argv.remove_all_objects();
+}
+
+void ShBtnRun::add_arg(const char *v)
+{
+       argv.append(cstrdup(v));
 }
 
 void ShBtnRun::run()
@@ -29,33 +43,58 @@ void ShBtnRun::run()
                perror("fork");
                return;
        }
-       if( pid > 0 ) {
-               int stat;  waitpid(pid, &stat, 0);
-               if( warn && stat ) {
-                       char msg[BCTEXTLEN];
-                       sprintf(msg, "%s: error exit status %d", name, stat);
-                       MainError::show_error(msg);
-               }
+       char msg[BCTEXTLEN];
+       if( !pid ) {
+               argv.append(0);
+               execvp(argv[0], &argv[0]);
                return;
        }
-       char *const argv[4] = { (char*) "/bin/bash", (char*) "-c", commands, 0 };
-       execvp(argv[0], &argv[0]);
+       // warn <0:always, =0:never, >0:on err
+       if( !warn ) return;
+       int stat;  waitpid(pid, &stat, 0);
+       if( !stat ) {
+               if( warn > 0 ) return;
+               sprintf(msg, "%s: completed", name);
+       }
+       else
+               sprintf(msg, "%s: error exit status %d", name, stat);
+       MainError::show_error(msg);
 }
 
-ShBtnPref::ShBtnPref(const char *nm, const char *cmds, int warn)
+ShBtnPref::ShBtnPref(const char *nm, const char *cmds, int warn, int run_script)
 {
        strncpy(name, nm, sizeof(name));
        strncpy(commands, cmds, sizeof(commands));
        this->warn = warn;
+       this->run_script = run_script;
 }
 
 ShBtnPref::~ShBtnPref()
 {
 }
 
+void ShBtnPref::execute(ArrayList<Indexable*> &args)
+{
+// thread async+autodelete, no explicit delete
+       ShBtnRun *job = new ShBtnRun(name, commands, warn);
+       job->add_arg("/bin/bash");
+       job->add_arg(commands);
+       int n = args.size();
+       for( int i=0; i<n; ++i ) {
+               Indexable *idxbl = args[i];
+               if( !idxbl->is_asset ) continue;
+               job->add_arg(idxbl->path);
+       }
+       job->start();
+}
+
 void ShBtnPref::execute()
 {
-       new ShBtnRun(name, commands, warn);
+       ShBtnRun *job = new ShBtnRun(name, commands, warn);
+       job->add_arg("/bin/bash");
+       job->add_arg("-c");
+       job->add_arg(commands);
+       job->start();
 }
 
 ShBtnEditDialog::ShBtnEditDialog(PreferencesWindow *pwindow)
@@ -87,7 +126,8 @@ void ShBtnEditDialog::handle_close_event(int result)
 
 
 ShBtnEditWindow::ShBtnEditWindow(ShBtnEditDialog *shbtn_edit, int x, int y)
- : BC_Window(_(PROGRAM_NAME ": Shell"), x, y, 300, 200, 300, 200, 0, 0, 1)
+ : BC_Window(_(PROGRAM_NAME ": Shell"), x, y,
+               xS(300), yS(200), xS(300), yS(200), 0, 0, 1)
 {
        this->shbtn_edit = shbtn_edit;
        sb_dialog = 0;
@@ -122,7 +162,7 @@ int ShBtnAddButton::handle_event()
 {
 
        Preferences *preferences = sb_window->shbtn_edit->pwindow->thread->preferences;
-       ShBtnPref *pref = new ShBtnPref(_("new"), "", 0);
+       ShBtnPref *pref = new ShBtnPref(_("new"), "", 0, 0);
        preferences->shbtn_prefs.append(pref);
        sb_window->list_update();
        return sb_window->start_edit(pref);
@@ -178,44 +218,89 @@ ShBtnTextDialog::~ShBtnTextDialog()
 }
 
 ShBtnTextWindow::ShBtnTextWindow(ShBtnEditWindow *sb_window, int x, int y)
- : BC_Window(_(PROGRAM_NAME ": Commands"), x, y, 640, 160, 640, 150, 0, 0, 1)
+ : BC_Window(_(PROGRAM_NAME ": Commands"), x, y,
+               xS(640), yS(160), xS(640), yS(150), 0, 0, 1)
 {
         this->sb_window = sb_window;
        warn = sb_window->sb_dialog->pref->warn;
+       run_script = sb_window->sb_dialog->pref->run_script;
 }
 
 ShBtnTextWindow::~ShBtnTextWindow()
 {
 }
 
+
+ShBtnErrWarnItem::ShBtnErrWarnItem(ShBtnErrWarn *popup,
+                const char *text, int warn)
+ : BC_MenuItem(text)
+{
+        this->popup = popup;
+        this->warn = warn;
+}
+
+int ShBtnErrWarnItem::handle_event()
+{
+        popup->set_text(get_text());
+       popup->st_window->warn = warn;
+        return 1;
+}
+
 ShBtnErrWarn::ShBtnErrWarn(ShBtnTextWindow *st_window, int x, int y)
- : BC_CheckBox(x, y, &st_window->warn, _("Warn on err exit"))
+ : BC_PopupMenu(x, y, xS(120), st_window->warn < 0 ? _("Always"):
+       !st_window->warn ? _("Never") : _("On Error"))
 {
         this->st_window = st_window;
 }
-
 ShBtnErrWarn::~ShBtnErrWarn()
 {
 }
+int ShBtnErrWarn::handle_event()
+{
+        return 0;
+}
+
+void ShBtnErrWarn::create_objects()
+{
+       add_item(new ShBtnErrWarnItem(this,_("Always"), -1));
+       add_item(new ShBtnErrWarnItem(this,_("Never"), 0));
+       add_item(new ShBtnErrWarnItem(this,_("On Error"), 1));
+}
+
+
+ShBtnRunScript::ShBtnRunScript(ShBtnTextWindow *st_window, int x, int y)
+ : BC_CheckBox(x, y, &st_window->run_script, _("run /path/script.sh + argvs"))
+{
+        this->st_window = st_window;
+}
+
+ShBtnRunScript::~ShBtnRunScript()
+{
+}
 
 void ShBtnTextWindow::create_objects()
 {
        lock_window("ShBtnTextWindow::create_objects");
-        int x = 10, y = 10;
-       int x1 = 160;
+        int x = xS(10), y = yS(10);
+       int x1 = xS(160);
        BC_Title *title = new BC_Title(x, y, _("Label:"));
        add_subwindow(title);
        title = new BC_Title(x1, y, _("Commands:"));
        add_subwindow(title);
-       y += title->get_h() + 8;
+       y += title->get_h() + yS(8);
        ShBtnPref *pref = sb_window->sb_dialog->pref;
-        cmd_name = new BC_TextBox(x, y, 140, 1, pref->name);
+        cmd_name = new BC_TextBox(x, y, xS(140), 1, pref->name);
         add_subwindow(cmd_name);
-        cmd_text = new BC_ScrollTextBox(this, x1, y, get_w()-x1-20, 4, pref->commands);
+        cmd_text = new BC_ScrollTextBox(this, x1, y, get_w()-x1-xS(20), 4, pref->commands);
        cmd_text->create_objects();
-       y += cmd_text->get_h() + 16;
+       y += cmd_text->get_h() + yS(16);
+        add_subwindow(title = new BC_Title(x1,y, _("OnExit Notify:")));
+       x1 += title->get_w() + xS(10);
         add_subwindow(st_err_warn = new ShBtnErrWarn(this, x1, y));
-        y = get_h() - ShBtnTextOK::calculate_h() - 10;
+       st_err_warn->create_objects();
+       x1 += st_err_warn->get_w() + xS(20);
+        add_subwindow(st_run_script = new ShBtnRunScript(this, x1, y));
+        y = get_h() - ShBtnTextOK::calculate_h() - yS(10);
         add_subwindow(new ShBtnTextOK(this, x, y));
         show_window();
        unlock_window();
@@ -237,6 +322,7 @@ int ShBtnTextOK::handle_event()
        strcpy(pref->name, st_window->cmd_name->get_text());
        strcpy(pref->commands, st_window->cmd_text->get_text());
        pref->warn = st_window->warn;
+       pref->run_script = st_window->run_script;
        return BC_OKButton::handle_event();
 }
 
@@ -276,13 +362,13 @@ void ShBtnEditWindow::create_objects()
        for( int i=0; i<preferences->shbtn_prefs.size(); ++i ) {
                shbtn_items.append(new ShBtnPrefItem(preferences->shbtn_prefs[i]));
        }
-       int x = 10, y = 10;
+       int x = xS(10), y = yS(10);
        add_subwindow(op_list = new ShBtnPrefList(this, x, y));
-       x = 190;
+       x = xS(190);
        add_subwindow(add_button = new ShBtnAddButton(this, x, y));
-       y += add_button->get_h() + 8;
+       y += add_button->get_h() + yS(8);
        add_subwindow(del_button = new ShBtnDelButton(this, x, y));
-       y += del_button->get_h() + 8;
+       y += del_button->get_h() + yS(8);
        add_subwindow(edit_button = new ShBtnEditButton(this, x, y));
        add_subwindow(new BC_OKButton(this));
        show_window();
@@ -308,7 +394,7 @@ ShBtnPrefItem::~ShBtnPrefItem()
 }
 
 ShBtnPrefList::ShBtnPrefList(ShBtnEditWindow *sb_window, int x, int y)
- : BC_ListBox(x, y, 140, 100, LISTBOX_TEXT, &sb_window->shbtn_items, 0, 0)
+ : BC_ListBox(x, y, xS(140), yS(100), LISTBOX_TEXT, &sb_window->shbtn_items, 0, 0)
 {
        this->sb_window = sb_window;
 }
@@ -331,7 +417,16 @@ MainShBtnItem::MainShBtnItem(MainShBtns *shbtns, ShBtnPref *pref)
 
 int MainShBtnItem::handle_event()
 {
-       pref->execute();
+       MWindow *mwindow = shbtns->mwindow;
+       if( pref->run_script ) {
+               AWindowGUI *agui = mwindow->awindow->gui;
+               agui->lock_window("MainShBtnItem::handle_event");
+               mwindow->awindow->gui->collect_assets();
+               pref->execute(*mwindow->session->drag_assets);
+               agui->unlock_window();
+       }
+       else
+               pref->execute();
        return 1;
 }