Reminder: Picture Switcher sale ends soon

Just wanted to remind everyone that the $10.00 off sale for Picture Switcher ends tomorrow at 11:59 PM EDT.  Grab it before it’s too late!

One Week In

So, I’m one week into my release of Picture Switcher, and things are going great. Even with the somewhat rocky start, with Picture Switcher crashing for some people, things are going good. I, of course, wish that hadn’t happened for anyone, but even with all the testing in the world you can’t always catch everything.

In case anyone missed it, I released an update over the weekend to fix another potential crash while Picture Switcher is resolving alias files, and a fix for the”Picture Folders” panel showing up disabled when opened. If you haven’t already downloaded it, head over to Picture Switcher’s product page and grab it. If anyone is still having issues with Picture Switcher, please do contact me! I can’t fix bugs if I don’t know they exist.

In more personal news, yesterday (Sunday) was my birthday. I couldn’t have asked for a better present than the success of this release. I want to thank everyone out there – you all rock. I hope y’all had as great a day as I did. :)

Picture Switcher version 2

Yesterday, I released Picture Switcher 2.0.  I have been working for months on this new version, and it’s a bit strange to me to actually be finished with it. Not that one is ever really “finished” with a software product.

My release even proved that – all my testing and those of my testers had no problems, but when I finally released it out into the wild there were some people for whom Picture Switcher would crash on launch.  Just goes to show that all the planning in the world doesn’t always work out the way one wishes it would.  I’ve spent the last day tracking down the problem and have just released 2.0.1 to fix the problem.

So, the big news is that I’ve decided to charge for this version.  It’s never easy to make a freeware program into shareware.  I’m sure I’m already getting a lot of grumbles about it.  Some people are probably planning on saving the old (free) version.  Hey, that’s fine, if that’s what you want to do.  I felt it was time for me to step up my software.  I would like to do this as my job. I absolutely love writing code. This is step one toward that goal. Does this mean that I’m suddenly going to make all of my applications shareware? No. At the moment, I don’t have any plans to do so. I do reserve the right to change my mind about it, of course, but rest assured if I do for any of them they will have more features than they currently do.

With all of the new features that Picture Switcher is now packing, I feel it is worth it.  Originally, I had planned to sell it for a lower price for a week, but with the problems with Picture Switcher crashing I pushed it back two more days – so now it is on sale for $20.00 through October 3, 2007 11:59 PM EDT.  Consider the price something between an upgrade and an initial pricing, since there is no way I’d have to verify if someone was a previous user of Picture Switcher. If you’re new to it, well welcome. :)

I do hope everyone enjoys the new features, and know that I have even more planned for future versions.  I had to force myself to freeze adding new features back in May because I would never have finished working on it otherwise.

I’m curious to hear everyone’s reactions to this release.  Feel free to comment. :)

Introducing Polish: A new framework

A month ago, Paul Kim over at Noodlesoft made a post about a proposal for a new way to install. In it, he described how it might be advantageous to display a dialog to the user asking them if they’d like to install the application if it were running from a disk image (or some other unwritable media).

As it so happens, I had already intended to write some code that checked that very thing, to fix a problem with Picture Switcher. I hesitate to call it a bug — it’s more like an unintended side effect. The problem was that in my last version, I decided to add in a dialog asking the user if they would like PS to run when they logged in. All fairly standard. What I hadn’t taken into account (and this would be a bug), was users running PS from the disk image. I should have put in a check for that. The unintended side effect is that, after having said yes to that dialog, every time they logged in the disk image would be mounted and run PS from there. I hadn’t even known the login items would do such a thing. Suffice to say, I’ve gotten some support emails about this issue.

So, I needed to write some code to both check if PS was running from a disk image and some code to fix the login item problem. I was working on another portion of PS when Paul made his proposal, but this past week I came back to fix up that section. The end result: a new framework.

Polish handles this and also handles login items. It will check if you are running from unwritable media OR running from the user’s download folder (for those of you using zip files or internet-enabled disk images), and if it is, will display a dialog asking the user if they’d like to copy the application to a different location. Polish can also check to see if the application is a login item, and if not display a dialog asking the user if they’d like it to run when they log in. You don’t have to check for either — you can check for whichever one suits your needs.

I wrote up my own code based loosely on the LoginItemsAE code for Polish, using NSAppleEventDescriptor (mostly — there are a few lower level AE calls that are still present). It does work. You can use Polish for the preferences section of your application, if you allow the user to add/remove it from the login items list. You’re not limited to just the check.

Here is the dialog presented to the user if they are running from some unwritable media or running from their download folder:
Polish's copy dialog

Note that I decided to use the term ‘copy’ rather than ‘install’ — I felt that had less of a psychological factor attached to it. ‘Install’ implies that more than just the application may be copied to the hard drive.

Here is the dialog presented to the user when asked if they’d like the application to run when they login:
Polish's login item dialog

The images are taken from the test application that comes with the framework. “Polish Test” will, of course, be replaced by your application’s name.

I can hear a few of you now: “Oh no, those dialogs are terrible! That won’t go with my application…” Well I actually thought of that. If you are using some sort of custom window scheme, or just don’t like they way the dialogs look, you can customize them or entirely replace them with your own window.

The download for the Polish framework contains a built version of the framework, a test application, the source to both of those, and documentation.

Head on over my Developer page to download it. The reference is also available there online, if you wish to look through it before downloading Polish.

For anyone curious as to why I named the framework “Polish” — well, I think the framework adds some polish to an application. But also, the Sparkle framework had a little influence, as well. ;)

Updated & New Code

For all of you developers who are using my code (all 3 of you), I’ve updated my DSClickableURLTextField and DSGeneralOutlineView classes, and added a new class, DSGeneralTableView. I’ve also written up some class references for these classes, so things are a little more documented now.

Jens Miltner emailed me some fixes to some subtle bugs with DSClickableURLTextField, and I added some functionality. Here’s the change list for it:

    Changes by Jens Miltner:

  • Fixed a problem with the text storage and the text field’s attributed string value having different lengths, causing range exceptions.
  • Added a delegate method allowing custom handling of URLs.
  • Tracks initially clicked URL at -mouseDown: to avoid situations where dragging would end up in a different URL at -mouseUp:, opening that URL. This includes situations where the user clicks on an empty area of the text field, drags the mouse, and ends up on top of a link, which would then erroneously open that link.
  • Fixed to allow string links to work as well as URL links.
    Changes by me:

  • Overrode -initWithCoder:, -initWithFrame:, and -awakeFromNib to explicitly set the text field to non-editable and non-selectable. Now you don’t need to remember to set this up, and the class will work correctly regardless.
  • Added in the ability for the user to copy URLs to the clipboard. Note that this is off by default.
  • Some code clean up.

I cleaned up the code a bit in DSGeneralOutlineView, and also added a new delegate method. Also of note, I added a parameter to the delegate method allowing you to create a custom drag image. If anyone is using this with DSGeneralOutlineView, you’ll need to update the delegate method to include the new parameter.

Here’s the change list for it:

  • Cleaned up the code a bit.
  • Added a new parameter to the delegate method that lets you create a custom drag image.
  • Added a new delegate method that will inform you of a failed drag.

DSGeneralTableView is a NSTableView subclass to go along with my DSGeneralOutlineView class. The two classes are almost identical, with the exception being one delegate method which calls with a row number for DSGeneralTableView rather than with an item with DSGeneralOutlineView.

The class references I wrote up are included in the download file for the respective classes, and are also available for viewing online:

DSClickableURLTextField Class Reference
DSGeneralOutlineView Class Reference
DSGeneralTableView Class Reference

Hope y’all enjoy the updates, and happy coding. :)