Directory Opus 13.17

Directory Opus 13.17

:inbox_tray: Download manually, or use Help > Check for Program Updates.

The following is a summary of new features and other significant changes from 13.16.

See the New Releases forum for detailed release notes for the various beta versions from 13.16.1 onwards.

Compatibility

  • Fixed problem with PowerToys Command Palette causing Opus to open a window for a folder called "The Internet" (but showing the content of the desktop), if Explorer Replacement was switched into "for all folders" mode.

Task Manager

The new Task Manager window displays a list of various types of running Opus tasks. Three task groups are shown currently - scripts, evaluator and background tasks. Currently background tasks only include thumbnail and metadata threads, but more background tasks may be added in the future.

The Task Manager shows each task's state and how much runtime has elapsed in total since it was started. You can cancel individual script and evaluator tasks, and can also activate an emergency "disable" flag for both types.

To access the Task Manager, use the command Help TASKMANAGER. This has been added to the default Help menu - reset the Operations toolbar to factory defaults to get this command automatically. It also has a default hotkey assigned - Ctrl+Shift+F1.

File Types

  • Added a Cloud item entry to the File Types dialog, under the Directory Opus File Types category. This is now responsible for adding the "Always keep on this device" and "Free up space" context menu commands for cloud storage files, and means you can remove them if unneeded.

  • Improvements for File Types dialog with file extensions that don't have "proper" entries in the registry, but instead are only assigned via the "Open With" system.

  • On startup, Opus no longer "repairs" the .Zip file type events (Opus-specific events for double-click, double-click + shift, etc.).

    The default events now only come from the Archives file type group, without the .Zip type adding further overrides.

    As well as simplifying things, this means you're now free to modify what happens when double-clicking Zip files inside Opus (e.g. if you always want Zips to open in a new tab, you can do that now).

Favorites

  • The Favorites system now allows files to be added to the list as well as folders.

    • Clicking a favorite file opens the file (except if displayed in the tree, where clicking it will read its parent folder and select the file).
    • The Folder Tree / Contents Preferences page has a new option for Favorites to show files in the folder tree.

Preferences

  • Added two new options in Internet / Updates:

    • Automatically install when Opus is inactive: After an update is downloaded, Opus will launch the installer automatically when idle (e.g. no file copies are ongoing). A UAC prompt may still be required.
    • Install updates with minimal interaction: Streamlines update installation when done via the update checker. A UAC prompt may still be required to install each update, but you won't normally need to see or click on the installer beyond that.
  • Internet / Updates now always allows you to turn off checks for new betas. If a beta is currently installed and beta updates are turned off, a note will appear informing you that the beta updates will still be detected until a stable release has been installed. There's also a link to easily revert to the previous stable release.

  • Added Folder Tabs / Options / Per-tab format lock option. When turned on, the format lock only applies to the tab that's visible when it's turned on - the lock state won't carry over to other tabs.

  • The Frequently Used Paths / SmartFavorites page now has a folder exclusion list, which lets you configure folders or wildcard patterns to exclude specific folders from the SmartFavorites system.

  • Moved the SmartFavorites points configuration to its own page.

  • Added Miscellaneous / Advanced: [Limits] hotkey_sequence_time option, which lets you change the default 5000ms timeout between keypresses when using multi-key hotkey sequences.

  • Added Folder Tree / Sorting Preferences page. It contains a few options related to sorting the folder tree.

    • Mirror sort order from file display: With this turned on, the sort order of folders in the tree will update to match the order in the file display whenever possible.
    • Numeric order sorting: Detect numbers in folder names and sort based on their numeric rather than lexical value.
    • Use global ignore prefix: Ignore the prefixes configured in Filtering and Sorting / Sorting in the tree as well as in the file display.
    • Word sort: Special handling for hyphens and other punctuation characters when sorting folder names.
  • Improved Preferences search for Chinese IMEs.

  • When Opus starts up it now runs a background task that automatically builds the Preferences search index if it's out of date. This means your first Preferences search after an upgrade shouldn't be noticeably slower than subsequent ones (unless you try to do it in the first 10 seconds or so after startup). This can be turned off via Preferences / Miscellaneous / Advanced: [Behavior] prefs_prebuild_search_index if desired.

Other Changes

  • In file collections a new column, Date Added, is available. This displays the date/time that each item was added to the collection. Note that existing collections do not contain this information so the column will not display data for any files added to collections by earlier versions.

  • The markup text code <#> for setting text/background color now accepts the "fill" keyword to make it fill the entire area rather than just the area behind the text. For example, <#ffffff #aa0000 fill>...</#> in the status bar would fill the entire status bar part with red.

Commands

  • Added "Select Random Item" command to the default Edit > Select Other menu.

  • Go FOLDERCONTENT, BACKLIST, FORWARDLIST and HISTORYLIST now support a maxwidth parameter to limit the width of menus it produces. If a file or folder name is longer than the specified value, it will be truncated.

  • Added new Go FOLDERCONTENT keyword resolvedirlinks. If this is specified, .lnk files are resolved to see if they point to folders and if so treated the same as folders (even when files would ordinarily be hidden). This means something like Go FOLDERCONTENT=move,resolvedirlinks will work with a folder full of directory shortcuts.

    Note that while similar, this option behaves slightly differently to the existing noparselinks keyword, particularly in relation to filters. The resolvedirlinks keyword specifically relates to links to folders, and the resolving is done earlier so they're actually treated as folders all along, meaning any filters the command uses will be compared against the link target rather than the link itself. The noparselinks option relates to links to both files and folders and is done later, and any filters will be compared against the link rather than its target.

  • You can now use embedded commands with Go FOLDERCONTENT=move etc. The commands will be added to each generated button following the instruction that actually performs the copy or move operation.

  • When using an embedded command with Go FOLDERCONTENT the chosen target path is now available as a variable called targetpath. It can be accessed in the embedded function as {$targetpath}.

  • Added Show VIEWCMD=nextrandom to make the standalone viewer jump to a random image in the list (without needing to be in slideshow mode).

  • Several changes for the Select command:

    • Added NOCOLUMN argument. Lets you use the RANGE argument without having the Index column automatically added to the file display.
    • Added new CASE and IGNOREDIACRITICS arguments, to control whether wildcard selections ignore case and/or diacritics.
    • The command Select INVERT TYPE=focus can now be used to toggle the selection of the item with focus (useful if you want to reassign the normal behaviour of Space to another key).
    • The Select SHOWHIDDEN argument can now be used in conjunction with HIDESEL and HIDEUNSEL, as well as by itself.
  • "Clear the filter automatically when changing folders" can now be overridden both ways when refreshing a folder via Go REFRESH=filterkeep and Go REFRESH=filterclear.

  • The Favorites command has a new TYPE argument which lets the generated favorites list in toolbars/menus exclude files or folders.

  • Added @clearoutput directive to clear the script log from a function.

  • Added @requires command modifier. Allows a function's requirements (e.g. source path, selected files) to be specified explicitly, if needed.

  • In "Command" mode the FAYT field now has a pin button which lets you pin it open and prevent it from disappearing when it loses focus. This lets you run a command and then edit the command line to run it again. You can toggle the pin from the keyboard with Ctrl+Shift+Page Down and Ctrl+Shift+Page Up.

Evaluator

  • Added for and while loops (plus break/continue keywords) to the evaluator. The syntax is the same as C/C++/Javascript, e.g. for (a = 0; a < 10; a++) { ... }. The body of the loop must be enclosed in {...} braces.

  • Added ListerCount value for evaluator SysInfo() function - returns the current number of open Listers.

  • In the Rename dialog, an evaluator insertion clause can now call (or return the result of) the Cancel() function in order to skip the current file.

  • Evaluator groups can now use markup in their headers. To use this, the group must return a value collection from the evaluator clause, with the marked up string assigned to a variable called markup. The name variable must also be present to provide the non-marked up name as before.

  • The evaluator Output() function now accepts an optional second parameter; if set to true, the output log will be cleared before the text is printed.

  • Added EscapeWild evaluator function.

Scripting

  • The FSUtil.Hash method can now operate asynchronously and return its result to a dialog's message loop. To use this, pass the Dlg object as the third argument to the Hash method. The Hash method will return an ID number for the request, and your message loop will receive a "hash" message when the result is ready. The Msg.data value provides the ID and the Msg.object value provides the hash (either as a string, or a vector for more than one hash type).

  • Added Path.GetDrive method. Returns a Drive object for the path (or false if path doesn't refer to a drive letter).

  • Added Drive.ssd property. Returns true if drive can be identified as solid state.

  • Added ListerCount property to SysInfo object - returns the current number of open Listers.

  • Added Control.GetItemRect() method. Returns a Rect object containing the position of the specified item or subitem. Works with listview, listbox and tab controls. The first argument is the item's index; for listviews in details mode, a second argument providing the subitem's index can optionally be provided. The rectangle is returned in client coordinates relative to the control; you can use the Control.ClientToScreen() method to convert to screen coordinates if needed.

  • The Dialog.SetTimer method has a new "One Shot" parameter which automatically kills the timer the first time it fires (the script can then set the timer again in response if it wishes). Can be used to avoid problems with asynchronous timer events.

  • The Tab object has a new unresolved property which provides unresolved versions of all the various Item collections (e.g. all, selected). Mostly useful with file collections which normally return the resolved path - accessing through the unresolved objects will return the native coll:// paths instead.

  • The Metadata object has a new special property which provides a collection of any folder-specific properties. For example, in file collections you can access the dateadded property this way to see when an item was added to the collection.

  • Listviews in script dialogs now send a "key" message when a key is pressed and the listview has focus. The Msg.data property provides the virtual key code of the key pressed, and Msg.value provides the name of the key in text form. Virtual key codes are listed here: Virtual-Key Codes (Winuser.h) - Win32 apps | Microsoft Learn

  • Scripts that wish to show their own configuration UI can now easily integrate it into the Script Management dialog (so that it's accessible via the normal script config button). There are two ways to do this:

    • The first way is to implement the OnConfigureScript method. Similar to the OnAboutScript method, this lets a script take over the configuration function completely and display its own dialog when the config button is pressed.

      This method means the script can't use standard configuration, because there would be no way for the user to configure it.

    • The second way is to implement the OnAddConfigPages method. This lets a script add additional tabs to the standard configuration dialog. The standard script configuration is still available to the user from the first tab.

      In response to OnAddConfigPages, the script must create a detached dialog containing a tab control with at least one tab. It must run a normal script message loop and handle all message processing as normal. The only difference is that instead of calling Dialog.Show() the script must call Dialog.AddConfigPages(), and pass through the AddConfigPagesData object that's supplied to the method.

  • Opus script objects now support the hasOwnProperty() method to check for the existence of a property by name.

  • The Vars.Set method will now fail if you try to store a non-Opus object (e.g. a JScript array) in a variable. Language-specific objects are associated with the particular instance of the script engine that creates them and can't survive once the script stops running. To persist non-Opus objects in Opus variables you can serialize them (e.g. by converting them to JSON strings).

11 Likes

Changes from 13.16.12

As well as the changes from 13.16.1 - 13.16.12, 13.17 also includes the following changes:

  • Fixed "Date added" column having no title if it was added to the root collections folder.
  • Fixed Dialog.CancelWatchClipboard not working.
  • Fixed evaluator issue in loops when break keyword was used.
  • In script dialogs, the "key" message now includes a textual description of the pressed key in the Msg.value property, as well as the key code in the Msg.data property.
3 Likes