Trigger clip picker: constrain browsing to parent folders.
Allow to move up to the highest common path, but not further.
This commit is contained in:
parent
96c80e88ac
commit
d06a70a10a
@ -158,6 +158,7 @@ void
|
|||||||
TriggerClipPicker::refill_dropdown ()
|
TriggerClipPicker::refill_dropdown ()
|
||||||
{
|
{
|
||||||
_dir.clear_items ();
|
_dir.clear_items ();
|
||||||
|
_root_paths.clear ();
|
||||||
|
|
||||||
/* Bundled Content */
|
/* Bundled Content */
|
||||||
Searchpath spath (ardour_data_search_path ());
|
Searchpath spath (ardour_data_search_path ());
|
||||||
@ -189,11 +190,61 @@ TriggerClipPicker::refill_dropdown ()
|
|||||||
_dir.AddMenuElem (Menu_Helpers::MenuElem (_("Other..."), sigc::mem_fun (*this, &TriggerClipPicker::open_dir)));
|
_dir.AddMenuElem (Menu_Helpers::MenuElem (_("Other..."), sigc::mem_fun (*this, &TriggerClipPicker::open_dir)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_subfolder (std::string const& parent, std::string dir)
|
||||||
|
{
|
||||||
|
assert (Glib::file_test (dir, Glib::FILE_TEST_IS_DIR | Glib::FILE_TEST_EXISTS));
|
||||||
|
assert (Glib::file_test (parent, Glib::FILE_TEST_IS_DIR | Glib::FILE_TEST_EXISTS));
|
||||||
|
|
||||||
|
if (parent.size () > dir.size ()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (parent == dir) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (dir == Glib::path_get_dirname (dir)) {
|
||||||
|
/* dir must be root */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
while (parent.size () < dir.size ()) {
|
||||||
|
/* step up, compare with parent */
|
||||||
|
dir = Glib::path_get_dirname (dir);
|
||||||
|
if (parent == dir) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
TriggerClipPicker::maybe_add_dir (std::string const& dir)
|
TriggerClipPicker::maybe_add_dir (std::string const& dir)
|
||||||
{
|
{
|
||||||
if (Glib::file_test (dir, Glib::FILE_TEST_IS_DIR | Glib::FILE_TEST_EXISTS)) {
|
if (Glib::file_test (dir, Glib::FILE_TEST_IS_DIR | Glib::FILE_TEST_EXISTS)) {
|
||||||
_dir.AddMenuElem (Gtkmm2ext::MenuElemNoMnemonic (Glib::path_get_basename (dir), sigc::bind (sigc::mem_fun (*this, &TriggerClipPicker::list_dir), dir, (Gtk::TreeNodeChildren*)0)));
|
_dir.AddMenuElem (Gtkmm2ext::MenuElemNoMnemonic (Glib::path_get_basename (dir), sigc::bind (sigc::mem_fun (*this, &TriggerClipPicker::list_dir), dir, (Gtk::TreeNodeChildren*)0)));
|
||||||
|
|
||||||
|
bool insert = true;
|
||||||
|
auto it = _root_paths.begin ();
|
||||||
|
while (it != _root_paths.end ()) {
|
||||||
|
bool erase = false;
|
||||||
|
if (it->size () > dir.size()) {
|
||||||
|
if (is_subfolder (dir, *it)) {
|
||||||
|
erase = true;
|
||||||
|
}
|
||||||
|
} else if (is_subfolder (*it, dir)) {
|
||||||
|
insert = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (erase) {
|
||||||
|
auto it2 = it;
|
||||||
|
++it;
|
||||||
|
_root_paths.erase (it2);
|
||||||
|
} else {
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (insert) {
|
||||||
|
_root_paths.insert (dir);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -375,8 +426,7 @@ TriggerClipPicker::list_dir (std::string const& path, Gtk::TreeNodeChildren cons
|
|||||||
std::sort (files.begin (), files.end ());
|
std::sort (files.begin (), files.end ());
|
||||||
|
|
||||||
if (!pc) {
|
if (!pc) {
|
||||||
std::string const parent = Glib::path_get_dirname (_current_path);
|
if (_root_paths.find (_current_path) == _root_paths.end ()) {
|
||||||
if (parent != _current_path) {
|
|
||||||
TreeModel::Row row = *(_model->append ());
|
TreeModel::Row row = *(_model->append ());
|
||||||
row[_columns.name] = "..";
|
row[_columns.name] = "..";
|
||||||
row[_columns.path] = Glib::path_get_dirname (_current_path);
|
row[_columns.path] = Glib::path_get_dirname (_current_path);
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#ifndef __gtk_ardour_trigger_clip_picker_h__
|
#ifndef __gtk_ardour_trigger_clip_picker_h__
|
||||||
#define __gtk_ardour_trigger_clip_picker_h__
|
#define __gtk_ardour_trigger_clip_picker_h__
|
||||||
|
|
||||||
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <gtkmm/box.h>
|
#include <gtkmm/box.h>
|
||||||
@ -90,6 +91,8 @@ private:
|
|||||||
|
|
||||||
std::string _current_path;
|
std::string _current_path;
|
||||||
|
|
||||||
|
std::set<std::string> _root_paths;
|
||||||
|
|
||||||
bool _seeking;
|
bool _seeking;
|
||||||
PBD::ScopedConnectionList _auditioner_connections;
|
PBD::ScopedConnectionList _auditioner_connections;
|
||||||
PBD::ScopedConnection _config_connection;
|
PBD::ScopedConnection _config_connection;
|
||||||
|
Loading…
Reference in New Issue
Block a user