add save project feature, shortcuts update
[goodguy/history.git] / cinelerra-5.1 / cinelerra / savefile.C
index b38aec142c4ec8e4d49aba1f97535354de22f191..a8dcc9dc773700a504e212c78c86fbd77d3dc301 100644 (file)
 
 #include "confirmsave.h"
 #include "bchash.h"
+#include "bcrecentlist.h"
 #include "edl.h"
-#include "errorbox.h"
 #include "file.h"
 #include "filexml.h"
 #include "fileformat.h"
 #include "indexfile.h"
 #include "language.h"
+#include "mainerror.h"
 #include "mainmenu.h"
 #include "mwindow.h"
 #include "mwindowgui.h"
@@ -228,21 +229,150 @@ void SaveAs::run()
 }
 
 
+SaveFileWindow::SaveFileWindow(MWindow *mwindow, char *init_directory)
+ : BC_FileBox(mwindow->gui->get_abs_cursor_x(1),
+       mwindow->gui->get_abs_cursor_y(1) - BC_WindowBase::get_resources()->filebox_h / 2,
+       init_directory,
+       _(PROGRAM_NAME ": Save"),
+       _("Enter a filename to save as"))
+{
+       this->mwindow = mwindow;
+}
 
+SaveFileWindow::~SaveFileWindow() {}
+
+
+
+int SaveProjectModeItem::handle_event()
+{
+       ((SaveProjectMode *)get_popup_menu())->update(id);
+       return 1;
+}
 
+SaveProjectMode::SaveProjectMode(SaveProjectWindow *gui, int x, int y)
+ : BC_PopupMenu(x, y, 100, "")
+{
+       this->gui = gui;
+       save_modes[SAVE_PROJECT_COPY]     = _("Copy");
+       save_modes[SAVE_PROJECT_SYMLINK]  = _("SymLink");
+       save_modes[SAVE_PROJECT_RELLINK]  = _("RelLink");
+}
 
+SaveProjectMode::~SaveProjectMode()
+{
+}
 
+void SaveProjectMode::create_objects()
+{
+       add_item(new SaveProjectModeItem(save_modes[SAVE_PROJECT_COPY],    SAVE_PROJECT_COPY));
+       add_item(new SaveProjectModeItem(save_modes[SAVE_PROJECT_SYMLINK], SAVE_PROJECT_SYMLINK));
+       add_item(new SaveProjectModeItem(save_modes[SAVE_PROJECT_RELLINK], SAVE_PROJECT_RELLINK));
+       set_text(save_modes[gui->save_mode]);
+}
 
+void SaveProjectMode::update(int mode)
+{
+       if( gui->save_mode == mode ) return;
+       set_text(save_modes[gui->save_mode = mode]);
+}
 
-SaveFileWindow::SaveFileWindow(MWindow *mwindow, char *init_directory)
- : BC_FileBox(mwindow->gui->get_abs_cursor_x(1),
-       mwindow->gui->get_abs_cursor_y(1) - BC_WindowBase::get_resources()->filebox_h / 2,
-       init_directory,
-       _(PROGRAM_NAME ": Save"),
-       _("Enter a filename to save as"))
+SaveProjectTextBox::SaveProjectTextBox(SaveProjectWindow *gui, int x, int y, int w)
+ : BC_TextBox(x, y, w, 1, gui->dir_path)
+{
+       this->gui = gui;
+}
+SaveProjectTextBox::~SaveProjectTextBox()
+{
+}
+
+int SaveProjectTextBox::handle_event()
+{
+       return 1;
+}
+
+SaveProjectWindow::SaveProjectWindow(MWindow *mwindow, const char *dir_path,
+                       int save_mode, int overwrite, int reload)
+ : BC_Window(_(PROGRAM_NAME ": Save Project"),
+               mwindow->gui->get_abs_cursor_x(1),
+               mwindow->gui->get_abs_cursor_y(1) -
+                       BC_WindowBase::get_resources()->filebox_h / 2,
+               540, 220, 540, 220, 0)
 {
        this->mwindow = mwindow;
+       strcpy(this->dir_path, dir_path);
+       this->overwrite = overwrite;
+       this->save_mode = save_mode;
+       this->reload = reload;
+}
+SaveProjectWindow::~SaveProjectWindow()
+{
 }
 
-SaveFileWindow::~SaveFileWindow() {}
+void SaveProjectWindow::create_objects()
+{
+       int x = 20, y = 20, x1 = get_w()-80;
+       BC_Title *title;
+       add_subwindow(title = new BC_Title(x, y, _("Project Directory:")));
+       y += title->get_h() + 10;
+       add_subwindow(textbox = new SaveProjectTextBox(this, x, y, x1-x));
+       x1 += 10;
+       add_subwindow(recent_project = new BC_RecentList("RECENT_PROJECT",
+               mwindow->defaults, textbox, 10, x1, y, 300, 100));
+       recent_project->load_items("RECENT_PROJECT");
+       x1 += recent_project->get_w() + 10;
+       add_subwindow(browse_button = new BrowseButton(mwindow->theme, this,
+               textbox, x1, y-5, "", "", "", 1));
+       y += textbox->get_h() + 20;
+       add_subwindow(mode_popup = new SaveProjectMode(this, x, y));
+       mode_popup->create_objects();
+       y += mode_popup->get_h() + 10;
+       x1 = x;
+       BC_CheckBox *overwrite_files, *reload_project;
+       add_subwindow(overwrite_files = new BC_CheckBox(x1, y, &overwrite, _("Overwrite files")));
+       x1 += overwrite_files->get_w() + 20;
+       add_subwindow(reload_project = new BC_CheckBox(x1, y, &reload, _("Reload project")));
+       add_subwindow(new BC_OKButton(this));
+       add_subwindow(new BC_CancelButton(this));
+       show_window(1);
+}
+
+SaveProject::SaveProject(MWindow *mwindow)
+ : BC_MenuItem(_("Save Project..."), "Alt-S", 's'), Thread()
+{
+       set_alt(1);
+       this->mwindow = mwindow;
+}
+
+int SaveProject::handle_event()
+{
+       start();
+       return 1;
+}
+
+void SaveProject::run()
+{
+       char dir_path[1024];  sprintf(dir_path, "~");
+       mwindow->defaults->get("PROJECT_DIRECTORY", dir_path);
+       int reload = mwindow->defaults->get("PROJECT_RELOAD", 0);
+       int overwrite = mwindow->defaults->get("PROJECT_OVERWRITE", 0);
+       int save_mode = mwindow->defaults->get("PROJECT_SAVE_MODE", 0);
+
+       SaveProjectWindow window(mwindow, dir_path, save_mode, overwrite, reload);
+       window.lock_window("SaveProject::run");
+       window.create_objects();
+       window.unlock_window();
+       int result = window.run_window();
+       if( result ) return;
+
+       strcpy(dir_path, window.textbox->get_text());
+       window.recent_project->add_item("RECENT_PROJECT", dir_path);
+       reload = window.get_reload();
+       overwrite = window.get_overwrite();
+       save_mode = window.get_save_mode();
+       mwindow->defaults->update("PROJECT_DIRECTORY", dir_path);
+       mwindow->defaults->update("PROJECT_RELOAD", reload);
+       mwindow->defaults->update("PROJECT_OVERWRITE", overwrite);
+       mwindow->defaults->update("PROJECT_SAVE_MODE", save_mode);
+       mwindow->save_project(dir_path, save_mode, overwrite, reload);
+}