It’s such a cool feeling to upload new versions. I submitted the results to the KDE apps repository and to freshmeat.net. The respective project pages are at Bookcase at apps.kde.com and Bookcase at freshmeat
Bookcase 0.4 is released. I fixed a few bugs, added a toolbar with a combobox for selecting which property to group the books by, and improveed the printing layout a bit.
I’ve learned more about XSLT than I ever wanted to know. You can’t use a parameter in the key() function, which limited me since I wanted to pass in the parameter from Bookcase. So I went a different route, much more inefficient, of doing two different sorts in the XSLT file. I also took advantage of the EXSLT extensions in libxslt which means at least version 1.0.19 is now required.
One of the joys of open-source development is getting feedback and patches from users. One of such users sent me a very nice email about his having found Bookcase to be a useful app. This makes me happy. Said user is also Italian, and he sent a long an Italian translation. Now, http://i18n.kde.org has lots of information for translators, and lots of information for developers building translation files, but not much about how I integrate the po file into my app. Autoconf seems to pick it up automatically, but I’ve not figured out how to test it. I’ve tried:
% KDE_LANG=it bookcase
% LANG=it bookcase
% LC_MESSAGES=it bookcase
% LC_ALL=it bookcase
and nothing seems to work…hmmm…
Orbital dynamics are very cool. I wanted to specialize in astrodynamics in school, but with all the computational tools being developed, my advisor recommended that I stick to something more broad. But in any case, next year, Mars will be closer to the Earth than it has been in 73,000 years. Not coincidentally, we also launch our Mars Exploration Rovers next year, although we launch before periapsis.
I worked a little on my Snowy River Pages and added some more scans of the Snowy River Arena Spectacular. I also fixed some validation issues.
My current area of play with Bookcase is changing the way the books are grouped. I’d like to show them grouped by author, and them change to genre, for example. I decided to cache a list of pointers to the book objects for each group. This became a bit tricky. My collection object holds a QDict, where the keys are the name of the attributes which may be used to group the books. The entry, though, is another QDict, where the keys are the values of the groups.
Now, I want to keep a list of pointers to the books which fall under this category, so I use a QPtrList of Books. So the variable becomes QDict<QDict<QPtrList<Book>>>. Typedefs made this look a bit clearer, but wow…
On top of that, since when a Book is modified or added, the QDict must be updated, I needed a way for the Book to know which lists it was in. The only implementation I could think of was the brute-force way of adding a QPtrList<QPtrList<Book>> to each Book. Then I go through and delete the Book from each QPtrList and so on…it feels monstrously inefficient, but it seems to work.
A columbian soccer player was struck by lightning and killed at practice yesterday. That’s nigh unbelievable…