posted under category: Browsers on November 14, 2007 by Nathan
I'd mentioned a couple years ago an application I wrote in .NET that my wife, Alanda, uses to update the photos on our family photos area. So, after much anticipation, I present the dopefly family photo uploader:
This is actually version 3, for the record. I polished this one off early this year, and have made only a few tweaks since.
Not too bad, huh? Thanks to Visual Studio 2005's drag & drop interface, it's got all kinds of standard looking gadgets like menus and a status bar - heh, it looks like a real application. :D It's not all that well architected, it's not as much MVC as I like to do in a web application, but with hardly any actual desktop application programming experience, I think it's not too bad.
Another thing that VS2k5 did that absolutely astounded me was that when I published my app to our media center PC (where we host our photos, it's always on), it created an installer, which Alanda ran from her tablet. It put shortcuts in the start menu and even made an uninstaller. After she did some first round testing and finding a couple bugs, I fixed them and republished - lo and behold, the next time she started the app, it prompted her to install the newest version. It was shocking how easy it was and how well it worked.
One problem that we had when Dopefly's photo management was strictly a web application was that it took forever to upload a 3+ megapixel image, and I had a form where she could do 10 at a time, so she would basically set-it-and-forget-it for half an hour at a time. This is the main reason why I wrote it, to resize the images on the client-side before they go up to the web, and .NET is especially good at this. This process has sped the process up dramatically.
Follow along for a shot of the admin and another one of the uploader tool...
The tool itself is a drag & drop interface (supports file / open) - Alanda finds a photo on her mapped photo drive and drops it on the main window. She then picks associated tags for the photo, or makes her own in the text field and types up a description if she wants. The program reads the photo date, resizes the image to the appropriate size and uploads to the web service on Dopefly. It's convenient and she can do the whole process in 30 seconds if she's in a hurry.
Now, if you notice the severe lack of completeness - how does Alanda manage all these photos once you put them up on the site? Well our tried and true ColdFusion seemed a much better fit because this data was already on Dopefly.
I copied a fair amount of the functionality from the front-end, search by date, by tag name, and display the latest photos, but reformatted into an administrative tool look. When she finds a photo, it gives complete power over editing the data, even a calendar pop-out thanks to the YUI calendar widget. Not so shabby at all.
Back on the uploader application, I put the action controls in a tab control box and added the ability to create a larger thumbnail (is it really a thumbnail at this point?) for emailing photos to friends and family. It uses the same image resizing library as before (but with slightly bigger numbers) and outputs the result onto a specified folder. The combo box on this page has a few presets (desktop, my documents, my photos), but what I thought was cool was that with a few clicks I hooked it up to introspect the file system, so if she types in c:\, it will auto-populate the drop-down with folders on the root of the drive, etc. Seriously, just a few clicks and it worked like a charm.
What have I learned?
I learned that Google is the best tool for application development ever created. When I got stuck, I would just google it.
Most of my problems stemmed from my not knowing how to name my problems to know what to google. What's the name of the class that handles such-and-such? Sometimes this would lead me down a series of googling efforts.
Visual Studio 2005 is pretty amazing for desktop applications (Thanks Microsoft for the free copy!).
Have patience with the learning process, it will come together eventually.