0

I have a Cocoa app that presents a folder structure to the user and allows basic file system operations such as move/copy/rename.

App screenshot

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:

  1. I schedule the file operation of moving the file on the background queue.
  2. 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.

Mark
  • 6,647
  • 1
  • 45
  • 88

1 Answers1

-1

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 transparent NSView over the area you want to prevent from user's interactions.