Small Kapow update

Today I made a release of Kapow that added the ability to filter what sessions are shown for each project. You can choose to see all items, only unbilled items, or only items that happened this year, month, or week. Beyond that there were the usual bugfixes and interface tweaks (for instance, it now shows the current project in the titlebar).

FocusWriter bugfix release

I have made a new release of FocusWriter, version 1.2.1. I added two small features in this release, before I decided to make this a bugfix release. The user can now disable anti-aliasing, and they can also move the text area’s horizontal position in each theme from the middle to either the left or the right of the window.

Cursor blinking in FocusWriter

I’ve been working on a bugfix release of FocusWriter for awhile now, and because of how long I’ve been working on it I decided to add a few small features along the way. Of course, the risk when doing that is that I might introduce new bugs, and that is exactly what happened.

After some requests, I added a nasty hack to allow the user to disable the cursor blinking because I couldn’t find a way in Qt to toggle it for a specific widget (if anyone has any ideas, I’m all ears). The hack seems to work fine under Linux, but it has a few issues on Windows and makes FocusWriter completely unusable on the Mac. Because of this I have reverted the feature for now, and I will look into it again in the future.

New Tanglet release

I have just released Tanglet 1.0.1, which has a few small bug fixes and a French translation provided by Mehdi Yousfi-Monod, including a word list and dice set. If you have any questions or comments about this release, please let me know. Otherwise, enjoy!

Small Hexalate release

I was recently made aware of the fact that Hexalate wasn’t launching on the Mac. It turns out that it was linking to Qt’s SVG module, even though it did not need to. I have made a release that fixes that.

A new game

A couple of months ago, my wife and I started playing the game Boggle. Neither of us could remember playing it before, but we were hooked right off of the start and couldn’t get enough of it.

Being me, I also couldn’t get the idea of writing a solver for the boards out of my head. I first wrote a stringlist matching solver, but that was incredibly slow. So I rewrote it to use a tree structure I designed specifically for walking through a list of words. I went looking online after I wrote my solver, and discovered that it is called a trie. And that they are a good way to solve Boggle. :)

I couldn’t stop tinkering with it, though, and soon found myself writing a computer version of Boggle. I have been working on a lot of things, so I didn’t focus on it solely and it ended up taking a couple of months to finish, although the amount of time I spent actually writing it was significantly less than that. Along with that I was sick recently, which delayed things a bit more.

I decided against having the computer version be multi-player for the reason that it is so easy to cheat. I had already written a simple GUI for solving boards, and it would take far less than 3 minutes to type the words into the solver and get the answers. I wouldn’t do that, but there would be no way to prevent other players from cheating.

After spending a little while thinking about it, I found what I think is a big improvement for a single player variant: you start with 30 seconds to find the words, but you get more time whenever you find a new word. I have found this to be a very addicting change.

I have released my computer variant of Boggle under the name of Tanglet. Enjoy!

Bugfix Kapow release

I have released Kapow 1.3.1, which includes fixes for a few small bugs throughout the main window of the program. The biggest fixes were that the user wasn’t informed of all session conflicts, and that the totals row wasn’t always shown. Also in this release is a German translation contribued by Swen-Peter Scheel. Enjoy!

But where to put you?

I’ve been writing programs with Qt since the Qt 3 era, and when I made my first Qt 4 programs available for general use I added cross platform support. One thing that entails is storing user data files in different locations on different platforms. At the time, I couldn’t find any way in Qt to do that, so I ended up writing this in CuteMaze:

QString homeDataPath()
{
#if defined(Q_OS_MAC)
    QString path = QDir::homePath() +
        "/Library/Application Support/GottCode/CuteMaze";
#elif defined(Q_OS_UNIX)
    QString path = qgetenv("XDG_DATA_HOME");
    if (path.isEmpty()) {
        path = QDir::homePath() + "/.local/share";
    }
    path += "/games/cutemaze";
#elif defined(Q_OS_WIN32)
    QString path = QDir::homePath() +
        "/Application Data/GottCode/CuteMaze";
#endif
    return path;
}

I’ve never been happy with that code. For one thing, it uses platform specific code in a platform independent codebase, which limits the number of supported platforms to those I can easily test myself. Thankfully, I will notice any bugs I introduce in one platform but not the rest, since I build my programs on those platforms.

However, I was recently made aware of the fact that CuteMaze would not compile on less common platforms, and that piece of code was one of the reasons. I figured that this was a chance to improve said code, so I went looking to see if there is a better way to write… and there is! After I released CuteMaze, a new class for desktop integration was added to Qt. The above code would be better written like this:

QString homeDataPath()
{
    return QDesktopServices::storageLocation( QDesktopServices::DataLocation ) + "/CuteMaze";
}

The above functionality was added in Qt 4.4. Instead of using it, I have been dragging the messy and inferior code from project to project. Obviously I don’t re-solve every problem I come to, I remember what I have done or what I have read about. It’s only natural I will miss things when reading about new versions of Qt.

Now that I know about this, I am going to use the new code for the platforms not already supported. In future projects I will use only the new code, but I don’t want to go through the headache of moving all of the user data files for all of my current projects.

A new CuteMaze release!

It has been over a year since I last updated CuteMaze. I have worked on it since then, but my other projects distracted me so much I didn’t think about it. A few months ago I added zooming support, but moving was pretty slow when zoomed out. I finally got around to looking at it a few days ago, and I discovered that I could noticeably speed up rendering by caching the background. I don’t know why I didn’t do that from the start, actually.

Once I had done that, I decided that it was time to polish up CuteMaze and make a release. I don’t want the new features to sit for too long without people getting to use them, and a year is pretty long! Along with zooming, I also added support for hints. Other than that it is mostly code cleanup. I had intended to rewrite the maze generation algorithms, but I lost interest in that and I have pushed that off to a future release.

For anybody who has made themes, this new release changes the format from being a collection of SVG files to being a single SVG file. You need to put a transparent rectangle behind smaller elements to make them render at the appropriate sizes. It is a fairly easy change to make, and you can look at the provided themes for examples.

Bugfix release for Connectagram

No matter how hard you try, a few bugs always slip through. The first bug I fixed was minor, and it was merely that I had overlooked what happens when you use more than one mouse button to drag the letters (answer: bad things).

The second bug I fixed was a slightly larger oversight on my part. Originally the game was single threaded, but I moved most of the game creation into a second thread shortly before making the first public release. When I did that I forgot about the fact that it is not safe to call rand() and srand() in two threads, which was causing the saved games to be loaded incorrectly. I replaced those calls with calls to qrand() and qsrand(), and now it has no problems loading the current game on start.

Next Page »