FWIW, I have the same kind of use cases: for different workflows, I tend to work within the sub-hierarchy of a specific folder (sometimes deeply nested), and to make it a bit more complex, I often need to access other folders that are scattered amongst the 10+ drives I use.
For thar very reason, I finally dropped the folder treeview, which is, IMHO, only interesting when you often need to navigate to places you don't really know and that you're searching for.
Instead, here is what I did:
- Set up a lister with opened tabs for every mostly used folders for that specific workflow (often leads to dual pane listers with 5-15 tabs spread between left/right or bottom/up panes)
- Save those listers as specific layouts, and use appropriate layout for appropriate workflow
In addition, I also had less often used folders that could be of interest in a dedicated workflow, and for that I defined tab groups for those folders, and developped a little script-add in (a FAYT script to be fully correct), that allows for loading/unloading those tab groups dynamically into my lister (see here if you are interested).
Another option, for single folders, is to use folder aliases which are (if named purposefully) easy to remember (and also allow later relocation without having to remember where they actually are).
In the end, this greatly speeds up my workflow: no more searching for folders in the tree, all the folders of interest are already opened (with ability to use tab border coloring for easier identification), and the less often used folders can be opened/closed at will.
Finally to ease up bringing up (or back an already instanciated) layout, I created a little script add-in that adds a new command ActivateOrCreateLister
which can create a new lister based on a layout, or just brings it to front if it already exists:
ActivateOrCreateLister.opusscriptinstall (2.0 KB)
Code for the script add-in (in case you want to customize the 'preset' layouts
// ActivateOrCreateLister
// (c) 2024 Stephane
// This is a script for Directory Opus.
// See https://www.gpsoft.com.au/endpoints/redirect.php?page=scripts for development information.
// Called by Directory Opus to initialize the script
function OnInit(initData)
{
initData.name = "ActivateOrCreateLister";
initData.version = "1.0";
initData.copyright = "(c) 2024 Stephane";
// initData.url = "https://resource.dopus.com/c/buttons-scripts/16";
initData.desc = "Search for specific lister (based on creation layout) and bring them to front when they exists or create them from that Layout";
initData.default_enable = true;
initData.group = "0 - Custom Scripts [SAL]";
initData.min_version = "13.0";
}
// Called to add commands to Opus
function OnAddCommands(addCmdData)
{
var cmd = addCmdData.AddCommand();
cmd.name = "ActivateOrCreateLister";
cmd.method = "OnActivateOrCreateLister";
cmd.desc = "";
cmd.label = "ActivateOrCreateLister";
cmd.template = "FORCE_CREATE/S,TARGET/O[SINGLE,SAMPLES_SOFTS,NATIVE_INSTRUMENTS,TOONTRACK_MIDI_ABLETON,MUSIC_BACKUP,LOUPEDECK,CUSTOM_TARGET],CUSTOM_NAME/O";
cmd.hide = false;
cmd.icon = "script";
}
// Implement the OnActivateOrCreateLister command
function OnActivateOrCreateLister(scriptCmdData)
{
var cdf = scriptCmdData.func;
var fsu = DOpus.fsUtil;
var forceCreate = false;
dout("TODO: Script command actions");
dout("Qualifiers = " + cdf.qualifiers);
dout("Has Target = " + cdf.args.got_arg.target);
dout("Has ForceCreate = " + cdf.args.got_arg.force_create);
dout("ForceCreate = " + cdf.args.force_create);
if (cdf.qualifiers.indexOf("ctrl") != -1 || cdf.args.force_create)
forceCreate = true;
// Prevent deselection. This this at the start so it's done even if we exit early.
cdf.command.deselect = false;
// What target type are we processing
if (cdf.args.got_arg.target) dout("Target Type is = " + cdf.args.target);
else {
dout("No target type provided : Exiting.", true);
return;
}
var layoutName = "";
switch (cdf.args.target) {
case "SINGLE" :
layoutName = "MyComputer - Simple";
break;
case "SAMPLES_SOFTS" :
layoutName = "Musique\\Music Production Samples & Softs";
break;
case "NATIVE_INSTRUMENTS" :
layoutName = "Musique\\Native Instruments";
break;
case "TOONTRACK_MIDI_ABLETON" :
layoutName = "Musique\\Toontrack MIDI Ableton";
break;
case "MUSIC_BACKUP" :
layoutName = "Musique\\Music Prod Backup Management";
break;
case "LOUPEDECK" :
layoutName = "Loupedeck";
break;
case "CUSTOM_TARGET" :
dout("Invoking custom target.");
if (!cdf.args.got_arg.custom_name) {
dout(" >> When invoking 'CUSTOM_TARGET' the 'CUSTOM_NAME' must be provided. Exiting.", true);
return;
}
else
{
layoutName = cdf.args.custom_name;
dout(" >> Provided target = '" + layoutName + "'");
}
break;
default:
dout("Unsupported target '" + cdf.args.target + "'", true);
return;
}
dout("Layout Name To search = " + layoutName);
var foundLister = null;
if (! forceCreate) {
for(var eListers = new Enumerator(DOpus.listers); !eListers.atEnd(); eListers.moveNext())
{
var l = eListers.item();
var layout = (l.layout == "")?"Unknown layout":l.layout;
if (layout == layoutName) {
dout("found layout (" + layout + ")");
foundLister = l;
break;
}
}
}
dout("End of loop. Found Lister ?=" + (foundLister!=null));
if (foundLister != null) {
cdf.command.SetSourceTab(foundLister.activetab);
cdf.command.RunCommand('Set LISTERCMD=tofront');
} else {
cdf.command.RunCommand('Prefs LAYOUT="' + layoutName + '"');
}
}
// Helper dout function
function dout(msg, error, time) {
if (error == undefined) error = false;
if (time == undefined) time = true;
DOpus.output(msg, error, time);
}