diff --git a/app/project/project.cpp b/app/project/project.cpp index 402983cac..d5e518026 100644 --- a/app/project/project.cpp +++ b/app/project/project.cpp @@ -23,6 +23,12 @@ Project::Project() { name_ = tr("(untitled)"); + + // FIXME: Test code + Folder* f = new Folder(); + f->set_name("Foldery Boy"); + root()->add_child(f); + // END Test code } Folder *Project::root() diff --git a/app/widget/projectexplorer/projectexplorer.cpp b/app/widget/projectexplorer/projectexplorer.cpp index 9f9a6ae17..03627169c 100644 --- a/app/widget/projectexplorer/projectexplorer.cpp +++ b/app/widget/projectexplorer/projectexplorer.cpp @@ -38,6 +38,7 @@ ProjectExplorer::ProjectExplorer(QWidget *parent) : // Set up navigation bar nav_bar_ = new ProjectExplorerNavigation(this); connect(nav_bar_, SIGNAL(SizeChanged(int)), this, SLOT(SizeChangedSlot(int))); + connect(nav_bar_, SIGNAL(DirectoryUpClicked()), this, SLOT(DirUpSlot())); layout->addWidget(nav_bar_); // Set up stacked widget @@ -96,6 +97,25 @@ void ProjectExplorer::AddView(QAbstractItemView *view) stacked_widget_->addWidget(view); } +void ProjectExplorer::BrowseToFolder(const QModelIndex &index) +{ + // Set appropriate views to this index + icon_view_->setRootIndex(index); + list_view_->setRootIndex(index); + + // Set navbar text to folder's name + if (index.isValid()) { + Folder* f = static_cast(index.internalPointer()); + nav_bar_->set_text(f->name()); + } else { + // Or set it to an empty string if the index is valid (which means we're browsing to the root directory) + nav_bar_->set_text(QString()); + } + + // Set directory up enabled button based on whether we're in root or not + nav_bar_->set_dir_up_enabled(index.isValid()); +} + void ProjectExplorer::DoubleClickViewSlot(const QModelIndex &index) { if (index.isValid()) { @@ -103,6 +123,14 @@ void ProjectExplorer::DoubleClickViewSlot(const QModelIndex &index) // Retrieve source item from index Item* i = static_cast(index.internalPointer()); + // If the item is a folder, browse to it + if (i->type() == Item::kFolder + && (view_type() == olive::ListView || view_type() == olive::IconView)) { + + BrowseToFolder(index); + + } + // Emit a signal emit DoubleClickedItem(i); @@ -121,6 +149,17 @@ void ProjectExplorer::SizeChangedSlot(int s) list_view_->setIconSize(QSize(s, s)); } +void ProjectExplorer::DirUpSlot() +{ + QModelIndex current_root = icon_view_->rootIndex(); + + if (current_root.isValid()) { + QModelIndex parent = current_root.parent(); + + BrowseToFolder(parent); + } +} + Project *ProjectExplorer::project() { return model_.project(); diff --git a/app/widget/projectexplorer/projectexplorer.h b/app/widget/projectexplorer/projectexplorer.h index d9c750365..fbe1825b0 100644 --- a/app/widget/projectexplorer/projectexplorer.h +++ b/app/widget/projectexplorer/projectexplorer.h @@ -33,7 +33,7 @@ #include "widget/projectexplorer/projectexplorernavigation.h" /** - * @brief The ProjectExplorer class + * @brief A widget for browsing through Project classes * * A widget for browsing through a Project structure. * @@ -78,6 +78,17 @@ private: */ void AddView(QAbstractItemView* view); + /** + * @brief Browse to a specific folder index in the model + * + * Only affects list_view_ and icon_view_. + * + * @param index + * + * Either an invalid index to return to the project root, or an index to a valid Folder object. + */ + void BrowseToFolder(const QModelIndex& index); + QStackedWidget* stacked_widget_; ProjectExplorerNavigation* nav_bar_; @@ -94,6 +105,8 @@ private slots: void DoubleClickViewSlot(const QModelIndex& index); void SizeChangedSlot(int s); + + void DirUpSlot(); }; #endif // PROJECTEXPLORER_H diff --git a/app/widget/projectexplorer/projectexplorernavigation.cpp b/app/widget/projectexplorer/projectexplorernavigation.cpp index 6361ab11a..0b93c3c66 100644 --- a/app/widget/projectexplorer/projectexplorernavigation.cpp +++ b/app/widget/projectexplorer/projectexplorernavigation.cpp @@ -35,6 +35,7 @@ ProjectExplorerNavigation::ProjectExplorerNavigation(QWidget *parent) : // Create "directory up" button dir_up_btn_ = new QPushButton(this); + dir_up_btn_->setEnabled(false); dir_up_btn_->setIcon(olive::icon::DirUp); dir_up_btn_->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); layout->addWidget(dir_up_btn_); @@ -63,6 +64,16 @@ void ProjectExplorerNavigation::set_text(const QString &s) dir_lbl_->setText(s); } +void ProjectExplorerNavigation::set_dir_up_enabled(bool e) +{ + dir_up_btn_->setEnabled(e); +} + +void ProjectExplorerNavigation::set_size_value(int s) +{ + size_slider_->setValue(s); +} + void ProjectExplorerNavigation::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { diff --git a/app/widget/projectexplorer/projectexplorernavigation.h b/app/widget/projectexplorer/projectexplorernavigation.h index bf6e86cde..83892ca38 100644 --- a/app/widget/projectexplorer/projectexplorernavigation.h +++ b/app/widget/projectexplorer/projectexplorernavigation.h @@ -26,16 +26,71 @@ #include #include +/** + * @brief A navigation bar widget for ProjectExplorer's Icon and List views + * + * Unlike the Tree view, Icon and List don't follow a hierarchical view of information. This means there is no direct + * way of navigating in and out of folders in those view types. We solve this in two ways: + * + * * Double clicking a Folder in those views will enter that folder + * * This navigation bar offers a "directory up" button for leaving a folder + * + * This navbar also provides an icon size slider for those views (between olive::kProjectIconSizeMinimum and + * olive::kProjectIconSizeMaximum) as well as text that's intended to be set to the current Folder's name (or + * empty for the root folder). + * + * This widget does not actually communicate to Project or ProjectExplorer classes. It is simply UI widgets that are + * intended to be connected in ways that do. This is the primarily responsibility of ProjectExplorer. + * + * By default, the directory up button is disabled (assuming root folder), the text is empty, and the icon size slider + * is set to olive::kProjectIconSizeDefault. + */ class ProjectExplorerNavigation : public QWidget { Q_OBJECT public: ProjectExplorerNavigation(QWidget* parent); + /** + * @brief Sets the text string + * + * This text is intended to be set to the current Folder's name + * + * @param s + */ void set_text(const QString& s); + /** + * @brief Set whether the "directory up" button is enabled or not + * + * @param e + */ + void set_dir_up_enabled(bool e); + + /** + * @brief Set the current value of the size slider + * + * NOTE: Does NOT emit SizeChanged(). + * + * @param s + * + * New size value to set to + */ + void set_size_value(int s); + signals: + /** + * @brief Signal emitted when the directory up button is clicked + */ void DirectoryUpClicked(); + + /** + * @brief Signal emitted when the icon size slider changes value + * + * @param size + * + * New size set in the slider + */ void SizeChanged(int size); protected: