11

I'm from a Windows programming background when writing tools, but have been programming using Carbon and Cocoa for the past year. I have introduced myself to Mac by, I admit it, hiding from UI programming. I've been basically wapping my OpenGL code in a view, then staying in my comfort zone using my platform agnostic OpenGL C++ code as usual.

However, now I want to start porting one of my more sophisticated applications to Mac OS.

Typically I use the standard Visual Studio dockable MDI approach, which is excellent, but very Windows-like. From using a Mac primarily now for a while, I don't tend to see this sort of method used for Mac UIs. Even Xcode doesn't support the idea of drag and drop/dockable views, unfortunately. I see docked views with splitter panels, but that's about it.

The closest thing I've seen to the Visual Studio approach is Photoshop CS4, which is pretty nice.

So what is the general consensus on this? Is there are more Mac-like way of achieving the same thing that I haven't seen? If not, I'm happy to write a window manager in Cocoa myself, so that I can finally delve in an learn what looks like an excellent API.

Note, I don't want to use QT or any other cross-platform libraries. The whole point is that I want to make a Mac app look like a Mac app, leave the Windows app looking like a Windows app. I always find the cross-platform libraries tend to lose this effect, and when I see a native Mac UI, with fancy Cocoa transitions and animations, I always smile. It's also a good excuse for me to learn Cocoa.

That being said, if there is an Open Source Cocoa library to do this, I'd love to know about it! I'd love to see how someone else achieves this, and would help smooth the Cocoa learning curve.

Cheers,

Shane

UPDATE: I forgot to mention a critical point. I support plugins, which can have their own UI to display various plugin specific information. I don't know which plugins will be loaded and I don't know where their UI will live, if I don't support docking. I'd love to hear people's thoughts on this, specifically: How do I support a plugin view architecture, if the UI can't change? Where do I put the plugin views?

Shane
  • 3,051
  • 3
  • 40
  • 45
  • 3
    Please don't be confused by the "answer" below. Dockable windows on the Mac have been around for a long time. (Adobe and Google both make apps with dockable windows, but it's not OK for you to do it? That's bull.) The real problem is that there aren't hundreds of companies making third party components for the Mac like there are for Windows. Here's an article and some code that can get you started with dockable palettes on OS X - http://apptree.net/dockables.htm – Wayne Bloss Nov 05 '11 at 18:49
  • Yeah, I think where there is a need for dockable windows, they are hard to beat. A classic example is Eclipse vs XCode (4). I can put windows wherever I want in Eclipse, whereas I'm hobbled in XCode. Thanks for the link, I'll check it out. – Shane Nov 08 '11 at 05:45

4 Answers4

9

Coming from a Windows background, you feel the need to have docking windows, but is it really essential to the app? Apple's philosophy (in my opinion) is that the designer knows better than the user how things should look and work. For example, iTunes is a pretty sophisticated app, but it doesn't let you change the UI around, change the skin, etc., because Apple wants to keep it consistent. They offer the full view, the mini player, and a handful of different viewing options, but they don't let you pull the source list off into a separate window, or dock it in other positions. They think it should be on the left, so there it stays...

You said you "want to make a Mac app look like a Mac app", and as you pointed out, Mac apps don't tend to have docking windows. Therefore, implementing your own docking windows is probably a step in the wrong direction ;)

Ken Aspeslagh
  • 11,484
  • 2
  • 36
  • 42
  • 4
    Fully agree with this. Adding: Adobe's latest suite is a prime example of how terrible an idea this is on the Mac OS X platform. :-) – Joshua Nozzi Feb 13 '10 at 02:18
  • Excellent answer Ken, and to be honest, I had a feeling this was what I was going to hear! I think you're right, I'll design so I'm mostly static, however I'll make sure I include the people the tool is intended for in the design process, because programmers are notoriously bad designers (I can say that because I am one ;)) Now, the first problem I will encounter with this approach is, how do I handle my plugin architecture, where plugins can have their own views, if the UI is mostly fixed. What do people do in this case? Which Mac apps are good examples of this? – Shane Feb 13 '10 at 03:29
  • 2
    For an Apple-supported plug-in architecture with a UI, take a look at how Audio Units are handled. Look at AULab in /Developer/Applications/Audio/. I wouldn't call AULab an example of great UI design, but it's worth looking at. What they do in there is open a new floating window (NSPanel) to display the UI for each Audio Unit. The window height gets resized as needed. Interface Builder does something similar with the inspector tab, allowing the height to change but restricting the width for displaying each class's unique UI. – Ken Aspeslagh Feb 13 '10 at 14:00
  • Excellent, I didn't even know that tool existed. I'l take a look :) – Shane Feb 14 '10 at 01:57
  • What if I just want to have dockable windows though, like Chrome? Google obviously did there own thing there with tear-off tabs and it's a great feature that fits in just fine with the "Mac way". This doesn't really answer the question. I suspect the real reason why Mac devs don't do it is because they don't have any nice packaged components to do it, like the Windows devs do. – Wayne Bloss Nov 05 '11 at 18:30
  • @wizlb: Down-voting everyone's answers and posting the same comment on each (and the original question) smells an awful lot like trolling to me. – Joshua Nozzi Nov 05 '11 at 19:32
  • @JoshuaNozzi Not at all. These answers are horrible because obviously people have done docking panels on OS X before and they work out just fine. If you think I'm trolling, why are you even responding to me? – Wayne Bloss Nov 05 '11 at 20:10
  • @wizlb Making a flat red button would work out just fine, too. Easily coded and it'd work. The argument the other responders and myself are making here is that a **dockable MDI** is **not** considered appropriate UI for the Mac OS X platform. Jump up and down and yell about it all you like but at the end of the day yours is the minority opinion and you're shooting the messengers to boot. Continue to talk if you like - that's all I have to say on the matter. – Joshua Nozzi Nov 05 '11 at 20:35
  • Nobody is jumping up and down. You are right that it's purely opinion based, which is why these answers should just be deleted; if not the whole question. The funny thing is that you were probably against _basic MDI_ too until Apple did it with XCode. My point is, there is that there are _major software companies that do it_ and it can be done, whether you personally like it or not. – Wayne Bloss Nov 05 '11 at 22:03
  • Also, readers can thank me for posting an actual code sample and article instead of just prattling on about "the Mac way" (which nobody follows anyway). Good day to you :) – Wayne Bloss Nov 05 '11 at 22:09
2

+1 to Ken's answer.

From a user perspective unless its integral to the app like it is in Adobe CS or Eclipse i want everything as concise as possible and all the different options and displays out of my way so i can focus on the document.

I think you will find with mac users that those who have the "user skill" to make use of rearranging panels will in most cases opt for hot key bindings instead, and those who dont have that level of "skill" youre just going to confuse.

I would recommend keeping it as simple as possible.

prodigitalson
  • 60,050
  • 10
  • 100
  • 114
2

One thing that's common among many Mac apps is the ability to hide all the chrome and focus on your content. That's the point behind the "tic tac" toolbar control in the top right corner of many windows. A serious weakness of many docking UIs is that they expect you to have the window take up most of the screen, because the docked panels can obscure content. Even if docked panels are collapsable, the space left by them is often just wasted and filled with white space. So, if you build a docking panel into your interface, you should expect it to be visible most of the time. For example, iTunes' source list is clearly designed to be visible all the time, but you can double-click a playlist to open it in a new window.

To get used to the range of Mac controls, I'd suggest you try doing some serious work with some apps that don't have a cross-platform UI; for example, the iWork apps, Interface Builder or Preview. Take note of where controls appear and why—in toolbars, in bottom bars, in inspectors, in source lists/sidebars, in panels such as IB's Library or the Font and Color panels, in contextual HUDs. Don't forget the menu bar either. Get an idea of the feel of controls—their responsiveness, modality, sizing, grouping and consistency. Try to develop some taste—not everything is perfect; just try iCal if you want to have something to make fun of.

Note that there's no "one size fits all" for controls, which can be an issue with docking UIs. It's important to think about workflow: how commonly used the control would be, whether you can replace it with direct manipulation, whether a visible indication of its state is necessary, whether it's operable from the keyboard and mouse where appropriate, and so forth. Figure out how the control's placement and behavior lets the user work more efficiently.

As a simple example of example of a good versus bad control placement and behavior in otherwise-decent applications, compare image masking in OmniGraffle and Keynote. In OmniGraffle, this uses the Image inspector where you have to first click on an unlabeled button ("Natural size") in order to enable the appropriate controls, then adjust size and position away in a low-fidelity fashion with an image thumbnail or by typing percentages into fields. Trying to resize the frame directly behaves in a bizarre and counterintuitive fashion.

In Keynote, masking starts with a sensibly named menu item or toolbar item, uses a HUD which pops up the instant you click on a masked image and allows for direct manipulation including a sensible display of the extent of the image you're masking. While you're dragging a masked image around, it even follows the guides. Advanced users can ignore the HUD entirely, just double-clicking the image to toggle mask editing and using the handles for sizing. It should be easy to see, with a few caveats (e.g. the state of "Edit Mask" mode should be visible in the HUD rather than just from the image; the outer border of the image you're masking should be more effectively used) Keynote is substantially better at this, in part because it doesn't use an inspector.

That said, if you do have a huge number of options and the standard tabbed inspector layout doesn't work for you, check out the Omni Group's OmniInspector framework. Try to use it for good, and hopefully you'll figure out how to obsess over UI as much as you do over graphics now :-)

Nicholas Riley
  • 43,532
  • 6
  • 101
  • 124
  • Thanks Nicholas, all good points (thanks for the Omni Group link too, very interesting). Out of interest, what other apps have you seen on Mac that support plugins with their own UI? – Shane Feb 13 '10 at 04:51
0

(running in slow motion, reaching out in panic) Nnnnnoooooooo!!!!!

:-) Seriously, as I mentioned in reply to Ken's excellent answer, trying to force a "Windowsism" on an OS X UI is definitely a bad idea. In my opinion, the biggest problem with Windows UI is third-party developers inventing new and inconsistent ways of presenting UI, rather than being consistent and following established conventions. To a Mac user, that's the sign of a terrible application. It's that way for a reason.

I encourage you to rethink your UI app's implementation from the ground up with the Mac OS in mind. If you've done your job well, the architecture and model (sans platform-specific implementation) should clearly translate to any platform.

In terms of UI, you've been using a Mac for a year, so you should have a pretty good idea of "the norm". If you have doubts, it's best to post a question specifically detailing what you need to present and your thoughts on how you might do it (or asking how if you have no idea).

Just don't whack your app with the ugly stick by forcing it to behave as if it were running in Windows when it's clearly not. That's the kiss of death for an app to Mac users.

Joshua Nozzi
  • 60,946
  • 14
  • 140
  • 135
  • I agree, which is exactly why I posted this question. :) I'm a Windows guy trying to do the 'right thing' for Mac people, of which I am well and truly one now. – Shane Feb 13 '10 at 03:24
  • Thanks, I'm a happier person for it :) – Shane Feb 13 '10 at 04:51
  • Google did "dockable" windows (tear-off tabs) and it fits in great. There are components that make it easy to do this in Windows. The real answer as to why no Mac devs do it, is because they don't have nice components like the Windows devs do. – Wayne Bloss Nov 05 '11 at 18:31
  • @wizlb: That's an awful lot of assuming you're doing there. The code to do something like this is trivial. It's not done on Mac OS because it's not considered "Mac-like" in design. Perhaps next time you down-vote everyone's answers you might base the vote on something other than an emotional response to platform-specific UI standards. – Joshua Nozzi Nov 05 '11 at 19:19
  • Except when it _is done_ and nobody really has a problem with it. Emotions have nothing to do with it, it's purely based on empirical evidence. (Oh and "(running in slow motion, reaching out in panic) Nnnnnoooooooo!!!!!" _IS_ obviously emotional, so why would it be a problem when I do it? (IF I were in fact doing that.)) – Wayne Bloss Nov 05 '11 at 20:13
  • You seem to be confusing "theatrical" with "emotional". – Joshua Nozzi Nov 05 '11 at 20:32
  • And you seem to be confusing logic for emotion. – Wayne Bloss Nov 05 '11 at 20:35
  • I'm not sure I follow on that one. Have a lovely day - I'm finished with this conversation. – Joshua Nozzi Nov 05 '11 at 20:36
  • In your first response you called my logical, reasoned comment "emotional". Follow now? – Wayne Bloss Nov 05 '11 at 22:05