diff --git a/app/core.cpp b/app/core.cpp index d18f421b5..12ccdee90 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -656,6 +656,38 @@ bool Core::SaveActiveProjectAs() return false; } +bool Core::SaveAllProjects() +{ + foreach (ProjectPtr p, open_projects_) { + if (!SaveProject(p.get())) { + return false; + } + } + + return true; +} + +bool Core::CloseActiveProject() +{ + return CloseProject(GetActiveProject(), true); +} + +bool Core::CloseAllExceptActiveProject() +{ + Project* active_proj = GetActiveProject(); + QList copy = open_projects_; + + foreach (ProjectPtr p, copy) { + if (p.get() != active_proj) { + if (!CloseProject(p.get(), true)) { + return false; + } + } + } + + return true; +} + QList Core::SupportedFrameRates() { QList frame_rates; @@ -930,6 +962,11 @@ bool Core::CloseAllProjects(bool auto_open_new) return true; } +bool Core::CloseAllProjects() +{ + return CloseAllProjects(true); +} + void Core::OpenProject() { QString file = QFileDialog::getOpenFileName(main_window_, diff --git a/app/core.h b/app/core.h index b45c85755..808bcac00 100644 --- a/app/core.h +++ b/app/core.h @@ -234,6 +234,31 @@ public slots: */ bool SaveActiveProjectAs(); + /** + * @brief Save all currently open projects + */ + bool SaveAllProjects(); + + /** + * @brief Closes the active project + * + * If no other projects are open, a new one is created automatically. + */ + bool CloseActiveProject(); + + /** + * @brief Closes all projects except the active project + */ + bool CloseAllExceptActiveProject(); + + /** + * @brief Closes all open projects + * + * Equivalent to `CloseAllProjects(true)`, but useful for the signal/slot system where you may not be able to specify + * parameters. + */ + bool CloseAllProjects(); + /** * @brief Set the current application-wide tool * diff --git a/app/window/mainwindow/mainmenu.cpp b/app/window/mainwindow/mainmenu.cpp index f279c3a0c..8d67bd9b7 100644 --- a/app/window/mainwindow/mainmenu.cpp +++ b/app/window/mainwindow/mainmenu.cpp @@ -55,6 +55,7 @@ MainMenu::MainMenu(MainWindow *parent) : file_open_recent_clear_item_ = file_open_recent_menu_->AddItem("clearopenrecent", Core::instance(), &Core::ClearOpenRecentList); file_save_item_ = file_menu_->AddItem("saveproj", Core::instance(), &Core::SaveActiveProject, "Ctrl+S"); file_save_as_item_ = file_menu_->AddItem("saveprojas", Core::instance(), &Core::SaveActiveProjectAs, "Ctrl+Shift+S"); + file_save_all_item_ = file_menu_->AddItem("saveallproj", Core::instance(), &Core::SaveAllProjects); file_menu_->addSeparator(); file_import_item_ = file_menu_->AddItem("import", Core::instance(), &Core::DialogImportShow, "Ctrl+I"); file_menu_->addSeparator(); @@ -62,6 +63,10 @@ MainMenu::MainMenu(MainWindow *parent) : file_menu_->addSeparator(); file_project_properties_item_ = file_menu_->AddItem("projectproperties", Core::instance(), &Core::DialogProjectPropertiesShow); file_menu_->addSeparator(); + file_close_project_item_ = file_menu_->AddItem("closeproj", Core::instance(), &Core::CloseActiveProject); + file_close_all_projects_item_ = file_menu_->AddItem("closeallproj", Core::instance(), static_cast(&Core::CloseAllProjects)); + file_close_all_except_item_ = file_menu_->AddItem("closeallexcept", Core::instance(), &Core::CloseAllExceptActiveProject); + file_menu_->addSeparator(); file_exit_item_ = file_menu_->AddItem("exit", parent, &MainWindow::close, "Ctrl+Q"); // @@ -302,7 +307,26 @@ void MainMenu::TimecodeDisplayTriggered() void MainMenu::FileMenuAboutToShow() { - file_project_properties_item_->setEnabled(Core::instance()->GetActiveProject()); + Project* active_project = Core::instance()->GetActiveProject(); + + file_project_properties_item_->setEnabled(active_project); + file_save_item_->setEnabled(active_project); + file_save_as_item_->setEnabled(active_project); + file_close_project_item_->setEnabled(active_project); + file_close_all_projects_item_->setEnabled(active_project); + file_close_all_except_item_->setEnabled(active_project); + + if (active_project) { + file_save_item_->setText(tr("&Save '%1'").arg(active_project->pretty_filename())); + file_save_as_item_->setText(tr("Save '%1' &As").arg(active_project->pretty_filename())); + file_close_project_item_->setText(tr("Close '%1'").arg(active_project->pretty_filename())); + file_close_all_except_item_->setText(tr("Close All Except '%1'").arg(active_project->pretty_filename())); + } else { + file_save_item_->setText(tr("&Save Project")); + file_save_as_item_->setText(tr("Save Project &As")); + file_close_project_item_->setText(tr("Close Project")); + file_close_all_except_item_->setText(tr("Close All Except Current Project")); + } } void MainMenu::ViewMenuAboutToShow() @@ -572,11 +596,11 @@ void MainMenu::Retranslate() file_open_item_->setText(tr("&Open Project")); file_open_recent_menu_->setTitle(tr("Open &Recent")); file_open_recent_clear_item_->setText(tr("&Clear Recent List")); - file_save_item_->setText(tr("&Save Project")); - file_save_as_item_->setText(tr("Save Project &As")); + file_save_all_item_->setText(tr("Sa&ve All Projects")); file_import_item_->setText(tr("&Import...")); file_export_item_->setText(tr("&Export...")); file_project_properties_item_->setText(tr("&Project Properties...")); + file_close_all_projects_item_->setText(tr("Close All Projects")); file_exit_item_->setText(tr("E&xit")); // Edit menu diff --git a/app/window/mainwindow/mainmenu.h b/app/window/mainwindow/mainmenu.h index 16bcd952a..e866db597 100644 --- a/app/window/mainwindow/mainmenu.h +++ b/app/window/mainwindow/mainmenu.h @@ -188,9 +188,13 @@ private: QAction* file_open_recent_clear_item_; QAction* file_save_item_; QAction* file_save_as_item_; + QAction* file_save_all_item_; QAction* file_import_item_; QAction* file_export_item_; QAction* file_project_properties_item_; + QAction* file_close_project_item_; + QAction* file_close_all_projects_item_; + QAction* file_close_all_except_item_; QAction* file_exit_item_; Menu* edit_menu_;