I have a Cocoa app that presents a folder structure to the user and allows basic file system operations such as move/copy/rename.
I perform all file system access on a background queue and use file coordination via NSFileCoordinator.
Let's imagine the user drags the file "Notes.txt" into the folder "Project B". Here is what I do:
- I schedule the file operation of moving the file on the background queue.
- Once that's done, it calls a block on the main queue where I update the outline view
Let's assume the background operation moving the file takes some time. I need to prevent that the user continues to move files around or performs other actions until the first operation completes.
Hence I would like to:
- Disable all user interaction with the window
- Disable most menu items and keyboard shortcuts
- Keep certain menus such as [Quit Cmd-Q] working
- Don't block the main thread
One solution that comes to mind: use a modal sheet?.
I don't want to do this, because most of the time, the operation will finish quickly and the sheet would only be shown for a fraction of a second, which is distracting.
I keep track of how long the operation takes would switch from "interaction blocked mode" to "modal sheet" if it takes more than 500 ms.
The question is: how can I implement such a "user interaction blocked mode" without actually presenting a modal sheet?
Alternative idea: disabling all controls
I considered setting isEnabled = false for all controls, but that's not an option, because the UI can be arbitrarily complex and it won't prevent actions via the menu or keyboard shortcuts.

You may find helpful The Responder Chain article in Apple's Documentation. Proper solution depends on what you exactly need. Overriding
NSMenu's- (BOOL)validateMenuItem:(NSMenuItem *)menuItem;let you control over enable menu items and its shortcuts. You may also put transparentNSViewover the area you want to prevent from user's interactions.