I’ve been working on the new CourseSetter UI for the last couple of weeks, and I’ve actually got something I’m willing to show off!
The original UI was written using the Managed DirectX extensions and made extensive use of the Sample Framework for dialogs, meshes and interaction. This made getting a good UX really hard as I had to handle the layout and drawing of all the controls I needed myself. This was, however, a neccessary headache as the resources required to use Windows Forms at 2560×1600 were too high. Screen real estate was an issue too, so I couldn’t go with a windowed application, the intended audience being used to charts up to 2 meters wide. So MDX it was.
For v2.0 there are a lot of changes to the UI, mostly brought about by a new course design concept, which concentrates on creating a set of template courses, which are applied to classes later. Doing this was going to involve tearing out all of the existing dialogs and interaction and adding new ones; It was the realisation of this coinciding with the release of the February CTP of WinFX (and more importantly the announcement of the upcoming March CTP of Expression Interactive Designer) that prompted the ditching of MDX in favour of rebuilding the UI, from scratch, with the Windows Presentation Foundation.
48 Hours later and I was in a position that took me 3 months to get to last year. The chart as a mesh was dropped in favour of a collection of filled paths (still rendered in hardware though), interaction is so much easier with WPFs new eventing model that I am making the most of. The best thing? Well that has got to be the databinding, I’d designed the datalayer with very simple mapping, one table one class, and CRUD stored procedures for each table whilst making use of the Data Application Block to go back and forth between the database. I’ve dumped that in favour of ADO.NET and DataSets, and have created a subclassed ObserveableCollection<T> for each business object. All this means that there is no business logic whatsoever in the UI and no massaging of data in code either, it’s all done declaratively.
One of the other things I like are the INotifyPropertyChanged and INotifyCollectionChanged interfaces, I didn’t have time to implement dirtying of collections last year, and was doing a retrieve of the entire dataset when anything changed (BAD!), so this should make the application alot more performant.
So with all that done I can concentrate on adding new functionality to make v2.0 more than just a makeover!
(As you can see from the before and after photos below there is still quite a bit to add, but that really should not take all that long to do! Oh and it may be an Apple screen, but it *IS* running on a PC, I promise!)
I’ve added a wider angle photo as now two people have asked if that is the top of a vodka bottle!!!