projectexplorer: added functionality for opening a folder in another tab/window
This commit is contained in:
@@ -37,7 +37,7 @@ FootageViewerPanel::FootageViewerPanel(QWidget *parent) :
|
||||
Retranslate();
|
||||
}
|
||||
|
||||
QList<Footage *> FootageViewerPanel::GetSelectedFootage()
|
||||
QList<Footage *> FootageViewerPanel::GetSelectedFootage() const
|
||||
{
|
||||
return {static_cast<FootageViewerWidget*>(GetTimeBasedWidget())->GetFootage()};
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ class FootageViewerPanel : public ViewerPanelBase, public FootageManagementPanel
|
||||
public:
|
||||
FootageViewerPanel(QWidget* parent);
|
||||
|
||||
virtual QList<Footage*> GetSelectedFootage() override;
|
||||
virtual QList<Footage*> GetSelectedFootage() const override;
|
||||
|
||||
void SetFootage(Footage* f);
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ OLIVE_NAMESPACE_ENTER
|
||||
|
||||
class FootageManagementPanel {
|
||||
public:
|
||||
virtual QList<Footage*> GetSelectedFootage() = 0;
|
||||
virtual QList<Footage*> GetSelectedFootage() const = 0;
|
||||
};
|
||||
|
||||
OLIVE_NAMESPACE_EXIT
|
||||
|
||||
@@ -72,7 +72,7 @@ ProjectPanel::ProjectPanel(QWidget *parent) :
|
||||
Retranslate();
|
||||
}
|
||||
|
||||
Project *ProjectPanel::project()
|
||||
Project *ProjectPanel::project() const
|
||||
{
|
||||
return explorer_->project();
|
||||
}
|
||||
@@ -102,17 +102,24 @@ void ProjectPanel::set_project(Project *p)
|
||||
}
|
||||
}
|
||||
|
||||
QList<Item *> ProjectPanel::SelectedItems()
|
||||
void ProjectPanel::set_root(Item *item)
|
||||
{
|
||||
explorer_->set_root(item);
|
||||
|
||||
Retranslate();
|
||||
}
|
||||
|
||||
QList<Item *> ProjectPanel::SelectedItems() const
|
||||
{
|
||||
return explorer_->SelectedItems();
|
||||
}
|
||||
|
||||
Folder *ProjectPanel::GetSelectedFolder()
|
||||
Folder *ProjectPanel::GetSelectedFolder() const
|
||||
{
|
||||
return explorer_->GetSelectedFolder();
|
||||
}
|
||||
|
||||
ProjectViewModel *ProjectPanel::model()
|
||||
ProjectViewModel *ProjectPanel::model() const
|
||||
{
|
||||
return explorer_->model();
|
||||
}
|
||||
@@ -157,7 +164,11 @@ void ProjectPanel::Edit(Item* item)
|
||||
|
||||
void ProjectPanel::Retranslate()
|
||||
{
|
||||
SetTitle(tr("Project"));
|
||||
if (explorer_->root_index().isValid()) {
|
||||
SetTitle(tr("Folder"));
|
||||
} else {
|
||||
SetTitle(tr("Project"));
|
||||
}
|
||||
|
||||
UpdateSubtitle();
|
||||
}
|
||||
@@ -187,14 +198,30 @@ void ProjectPanel::ShowNewMenu()
|
||||
|
||||
void ProjectPanel::UpdateSubtitle()
|
||||
{
|
||||
if (project() == nullptr) {
|
||||
SetSubtitle(tr("(none)"));
|
||||
if (project()) {
|
||||
QString project_title = QStringLiteral("[*]%1").arg(project()->name());
|
||||
|
||||
if (explorer_->root_index().isValid()) {
|
||||
QString folder_path;
|
||||
|
||||
Item* item = static_cast<Item*>(explorer_->root_index().internalPointer());
|
||||
|
||||
do {
|
||||
folder_path.prepend(QStringLiteral("/%1").arg(item->name()));
|
||||
|
||||
item = item->parent();
|
||||
} while (item != project()->root());
|
||||
|
||||
project_title.append(folder_path);
|
||||
}
|
||||
|
||||
SetSubtitle(project_title);
|
||||
} else {
|
||||
SetSubtitle(QStringLiteral("[*]%1").arg(project()->name()));
|
||||
SetSubtitle(tr("(none)"));
|
||||
}
|
||||
}
|
||||
|
||||
QList<Footage *> ProjectPanel::GetSelectedFootage()
|
||||
QList<Footage *> ProjectPanel::GetSelectedFootage() const
|
||||
{
|
||||
QList<Item*> items = SelectedItems();
|
||||
QList<Footage*> footage;
|
||||
|
||||
@@ -37,16 +37,18 @@ class ProjectPanel : public PanelWidget, public FootageManagementPanel
|
||||
public:
|
||||
ProjectPanel(QWidget* parent);
|
||||
|
||||
Project* project();
|
||||
Project* project() const;
|
||||
void set_project(Project* p);
|
||||
|
||||
QList<Item*> SelectedItems();
|
||||
void set_root(Item* item);
|
||||
|
||||
Folder* GetSelectedFolder();
|
||||
QList<Item*> SelectedItems() const;
|
||||
|
||||
virtual QList<Footage*> GetSelectedFootage() override;
|
||||
Folder* GetSelectedFolder() const;
|
||||
|
||||
ProjectViewModel* model();
|
||||
virtual QList<Footage*> GetSelectedFootage() const override;
|
||||
|
||||
ProjectViewModel* model() const;
|
||||
|
||||
virtual void SelectAll() override;
|
||||
virtual void DeselectAll() override;
|
||||
|
||||
@@ -38,7 +38,7 @@ ProjectViewModel::ProjectViewModel(QObject *parent) :
|
||||
columns_.append(kRate);
|
||||
}
|
||||
|
||||
Project *ProjectViewModel::project()
|
||||
Project *ProjectViewModel::project() const
|
||||
{
|
||||
return project_;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ public:
|
||||
*
|
||||
* Currently active project or nullptr if there is none
|
||||
*/
|
||||
Project* project();
|
||||
Project* project() const;
|
||||
|
||||
/**
|
||||
* @brief Set the project to adapt
|
||||
|
||||
@@ -85,7 +85,7 @@ ProjectExplorer::ProjectExplorer(QWidget *parent) :
|
||||
connect(icon_view_, &ProjectExplorerIconView::customContextMenuRequested, this, &ProjectExplorer::ShowContextMenu);
|
||||
}
|
||||
|
||||
const ProjectToolbar::ViewType &ProjectExplorer::view_type()
|
||||
const ProjectToolbar::ViewType &ProjectExplorer::view_type() const
|
||||
{
|
||||
return view_type_;
|
||||
}
|
||||
@@ -148,7 +148,7 @@ void ProjectExplorer::BrowseToFolder(const QModelIndex &index)
|
||||
nav_bar_->set_dir_up_enabled(index.isValid());
|
||||
}
|
||||
|
||||
QAbstractItemView *ProjectExplorer::CurrentView()
|
||||
QAbstractItemView *ProjectExplorer::CurrentView() const
|
||||
{
|
||||
return static_cast<QAbstractItemView*>(stacked_widget_->currentWidget());
|
||||
}
|
||||
@@ -251,7 +251,17 @@ void ProjectExplorer::ShowContextMenu()
|
||||
} else {
|
||||
context_menu_item_ = selected_items.first();
|
||||
|
||||
if (context_menu_item_->type() == Item::kFootage) {
|
||||
if (context_menu_item_->type() == Item::kFolder) {
|
||||
|
||||
QAction* open_in_new_tab = menu.addAction(tr("Open in New Tab"));
|
||||
connect(open_in_new_tab, &QAction::triggered, this, &ProjectExplorer::OpenContextMenuItemInNewTab);
|
||||
|
||||
QAction* open_in_new_window = menu.addAction(tr("Open in New Window"));
|
||||
connect(open_in_new_window, &QAction::triggered, this, &ProjectExplorer::OpenContextMenuItemInNewWindow);
|
||||
|
||||
menu.addSeparator();
|
||||
|
||||
} else if (context_menu_item_->type() == Item::kFootage) {
|
||||
QString reveal_text;
|
||||
|
||||
#if defined(Q_OS_WINDOWS)
|
||||
@@ -319,7 +329,17 @@ void ProjectExplorer::RevealSelectedFootage()
|
||||
#endif
|
||||
}
|
||||
|
||||
Project *ProjectExplorer::project()
|
||||
void ProjectExplorer::OpenContextMenuItemInNewTab()
|
||||
{
|
||||
Core::instance()->main_window()->FolderOpen(project(), context_menu_item_, false);
|
||||
}
|
||||
|
||||
void ProjectExplorer::OpenContextMenuItemInNewWindow()
|
||||
{
|
||||
Core::instance()->main_window()->FolderOpen(project(), context_menu_item_, true);
|
||||
}
|
||||
|
||||
Project *ProjectExplorer::project() const
|
||||
{
|
||||
return model_.project();
|
||||
}
|
||||
@@ -329,7 +349,20 @@ void ProjectExplorer::set_project(Project *p)
|
||||
model_.set_project(p);
|
||||
}
|
||||
|
||||
QList<Item *> ProjectExplorer::SelectedItems()
|
||||
QModelIndex ProjectExplorer::root_index() const
|
||||
{
|
||||
return tree_view_->rootIndex();
|
||||
}
|
||||
|
||||
void ProjectExplorer::set_root(Item *item)
|
||||
{
|
||||
QModelIndex index = model_.CreateIndexFromItem(item);
|
||||
|
||||
BrowseToFolder(index);
|
||||
tree_view_->setRootIndex(index);
|
||||
}
|
||||
|
||||
QList<Item *> ProjectExplorer::SelectedItems() const
|
||||
{
|
||||
// Determine which view is active and get its selected indexes
|
||||
QModelIndexList index_list = CurrentView()->selectionModel()->selectedRows();
|
||||
@@ -348,7 +381,7 @@ QList<Item *> ProjectExplorer::SelectedItems()
|
||||
return selected_items;
|
||||
}
|
||||
|
||||
Folder *ProjectExplorer::GetSelectedFolder()
|
||||
Folder *ProjectExplorer::GetSelectedFolder() const
|
||||
{
|
||||
if (project() == nullptr) {
|
||||
return nullptr;
|
||||
|
||||
@@ -49,12 +49,16 @@ class ProjectExplorer : public QWidget
|
||||
public:
|
||||
ProjectExplorer(QWidget* parent);
|
||||
|
||||
const ProjectToolbar::ViewType& view_type();
|
||||
const ProjectToolbar::ViewType& view_type() const;
|
||||
|
||||
Project* project();
|
||||
Project* project() const;
|
||||
void set_project(Project* p);
|
||||
|
||||
QList<Item*> SelectedItems();
|
||||
QModelIndex root_index() const;
|
||||
|
||||
void set_root(Item* item);
|
||||
|
||||
QList<Item*> SelectedItems() const;
|
||||
|
||||
/**
|
||||
* @brief Use a heuristic to determine which (if any) folder is selected
|
||||
@@ -68,7 +72,7 @@ public:
|
||||
* A folder that's heuristically been determined as "selected", or the root directory if none, or nullptr if no
|
||||
* project is open.
|
||||
*/
|
||||
Folder* GetSelectedFolder();
|
||||
Folder* GetSelectedFolder() const;
|
||||
|
||||
/**
|
||||
* @brief Access the ViewModel model of the project
|
||||
@@ -122,7 +126,7 @@ private:
|
||||
/**
|
||||
* @brief Get the currently active QAbstractItemView
|
||||
*/
|
||||
QAbstractItemView* CurrentView();
|
||||
QAbstractItemView* CurrentView() const;
|
||||
|
||||
QStackedWidget* stacked_widget_;
|
||||
|
||||
@@ -163,6 +167,10 @@ private slots:
|
||||
|
||||
void RevealSelectedFootage();
|
||||
|
||||
void OpenContextMenuItemInNewTab();
|
||||
|
||||
void OpenContextMenuItemInNewWindow();
|
||||
|
||||
};
|
||||
|
||||
OLIVE_NAMESPACE_EXIT
|
||||
|
||||
@@ -176,6 +176,33 @@ void MainWindow::SetTaskbarButtonProgress(int value, int max)
|
||||
}
|
||||
#endif
|
||||
|
||||
void MainWindow::FolderOpen(Project *p, Item *i, bool floating)
|
||||
{
|
||||
ProjectPanel* panel = PanelManager::instance()->CreatePanel<ProjectPanel>(this);
|
||||
|
||||
panel->set_project(p);
|
||||
panel->set_root(i);
|
||||
|
||||
// Tabify with source project panel
|
||||
foreach (ProjectPanel* proj_panel, project_panels_) {
|
||||
if (proj_panel->project() == p) {
|
||||
tabifyDockWidget(proj_panel, panel);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
panel->setFloating(floating);
|
||||
|
||||
panel->show();
|
||||
panel->raise();
|
||||
|
||||
// If the panel is closed, just destroy it
|
||||
panel->SetSignalInsteadOfClose(true);
|
||||
connect(panel, &ProjectPanel::CloseRequested, this, &MainWindow::FolderCloseRequested);
|
||||
|
||||
folder_panels_.append(panel);
|
||||
}
|
||||
|
||||
void MainWindow::SetFullscreen(bool fullscreen)
|
||||
{
|
||||
if (fullscreen) {
|
||||
@@ -251,6 +278,12 @@ void MainWindow::ProjectClose(Project *p)
|
||||
}
|
||||
}
|
||||
|
||||
foreach (ProjectPanel* panel, folder_panels_) {
|
||||
if (panel->project() == p) {
|
||||
panel->close();
|
||||
}
|
||||
}
|
||||
|
||||
// Close any open sequences from project
|
||||
QList<ItemPtr> open_sequences = p->get_items_of_type(Item::kSequence);
|
||||
|
||||
@@ -326,6 +359,14 @@ void MainWindow::ProjectCloseRequested()
|
||||
Core::instance()->CloseProject(p, true);
|
||||
}
|
||||
|
||||
void MainWindow::FolderCloseRequested()
|
||||
{
|
||||
ProjectPanel* panel = static_cast<ProjectPanel*>(sender());
|
||||
|
||||
folder_panels_.removeOne(panel);
|
||||
panel->deleteLater();
|
||||
}
|
||||
|
||||
TimelinePanel* MainWindow::AppendTimelinePanel()
|
||||
{
|
||||
TimelinePanel* panel = AppendPanelInternal<TimelinePanel>(timeline_panels_);
|
||||
|
||||
@@ -65,6 +65,8 @@ public:
|
||||
void SetTaskbarButtonProgress(int value, int max);
|
||||
#endif
|
||||
|
||||
void FolderOpen(Project* p, Item* i, bool floating);
|
||||
|
||||
public slots:
|
||||
void ProjectOpen(Project *p);
|
||||
|
||||
@@ -105,6 +107,7 @@ private:
|
||||
SequenceViewerPanel* sequence_viewer_panel_;
|
||||
FootageViewerPanel* footage_viewer_panel_;
|
||||
QList<ProjectPanel*> project_panels_;
|
||||
QList<ProjectPanel*> folder_panels_;
|
||||
ToolPanel* tool_panel_;
|
||||
QList<TimelinePanel*> timeline_panels_;
|
||||
AudioMonitorPanel* audio_monitor_panel_;
|
||||
@@ -127,6 +130,8 @@ private slots:
|
||||
|
||||
void ProjectCloseRequested();
|
||||
|
||||
void FolderCloseRequested();
|
||||
|
||||
};
|
||||
|
||||
OLIVE_NAMESPACE_EXIT
|
||||
|
||||
Reference in New Issue
Block a user