Sunday, 21 November 2010

Invalid password

Kadu never had good support for Invalid Password message. If you were lucky you would get a notification about that and then you had to find a place to enter your valid password. This has changed recently. When Kadu receives "invalid password" error from server a new notification is displayed (it is nice and transparent):

If you dont remember your password, you can click "Ignore" and Kadu will stop trying to connect. If you know your real password, you can click "Enter new password" button and get this pretty window:

(yes, it is still half-translated).

After clicking "Ok" Kadu will try to connect again. So easy and so nice ;)

Wednesday, 10 November 2010

Beyond 0.6.6

As 0.6.6 release of Kadu is getting closer and closer Kadu Team is already thinking about future versions. We do not have as huge plans as after 0.6.5, but still :)


We want to make releases faster (there is almost a year now from 0.6.6-alpha0 release)!
Ideally we will have new full release every 3 to 4 months (that means 3 to 4 full releases every year, 6 to 8 times more than now)! This will of course make these releases smaller and MUCH easier to maintain. And with less features every release we will have less bugs, so everyone wins :)

Usability and look & feel

Our usability and look & feel improved a lot (transparency!) last two years thanks to our usability team, but there is still very much to do. We have modules window that is ugly. Syntax editors in configuration dialog are not very pretty... We need better widgets for color themes and shortcut editors. A fresh new "Open chat with..." window would be nice too.

I hope at some time we will get QML-based buddies list widget. With animations, transitions and all the fancy stuff everybody loves ;)

Modules/plugins support

We have pretty good modules system. But... Our plugin manager window is not usable at all. We need new one. We need a method for auto-loading of needed modules (based on user's configuration) so users could check "i want this feature" instead of going to modules window and search for module name in plain list. We need per-plugin configuration windows so users do not need to search for options. Moving from Kadu-specific .desc files to standard .desktop would be nice too.

Better protocols support

We do not have full GG10 protocol support. That is sad, as Kadu was created as Gadu-Gadu only application.

0.6.6 is first release with XMPP support, so I'm sure we don't have all features implemented ;)
Kadu does not supports transports or XMPP services now :(

Better code

No much to say here. Code always can be better. I'm trying to improve our code in every place so it is/will be very easy to maintain and modify.

1.0 release?

I hope we will have it before end of the world in 2012 ;)

Saturday, 12 June 2010

New delete buddy window

I know there was no blog posts for some time... I was busy moving to new place and I've got my Starcraft II Beta Key so you know ;) No time for anything else ;)

But SC II Beta is now over and I've got back to work on Kadu. Today I've finished a small feature that allows us to use one window for deleting contacts. It seems silly, but we had two in Kadu 0.6.5: one for deleting contact and one for removing its history. Now every module can add an checkbox to this window, and this is how it looks now:

We need different icons for these two buttons, I know ;)

Friday, 26 February 2010

Story of Screenshot module

I haven't wrote anything about Kadu code recently, because there was nothing exciting there during last months. Bugfixing and polishing everything (yes, we created best IM ever, but it still has bugs!). This is so boring I've decided I need to learn something new, like Qt's QGraphicsView. Kadu's screenshot module was ideal target for moving to this framework (next one - for 0.8 or 0.9 - will be our buddy list).

1. Old code

To port module required reading old (legacy) code. That was not hard - it was only one big file: screenshot.cpp. As you know I don't like big files and big classes. Fortunately, the code was split into 3 classes: ShotSizeHint (small widget that displays image size in pixels and kB), ScreenShotConfigurationUiHandler (class that handles configuration widgets in configuration window) and Screenshot (class that was doing eveything else).

One thing scared me: for doing one real screenshot this module could take 4 or more (instead of storing first one in QPixmap object).

2. New classes

Big splitting began (remember: one class, one purpose!). Each extracted class deserves its own file. Global variable were moved to classes as static fields, so initialization of module looks like this: screenshot_module.cpp. This is excellent example of small and clean file that is easily understandable.


Some part of old big Screenshot class was commented as code taken from KSnapshot from KDE. And it didn't use a single field from this class. Moving these methods to their own class and making them static was an easy step. This is how it looks now: pixmap-grabber.h.


This class is a small experiment. It is the only class in screenshot module that has access to config_file global variable. Other classes does not have to how configuration variables are stored and how to access them. This removed some duplication (like reading the same value in many places of code).


This class has only one purpose - save a QPixmap like a screenshot and return path to the file. It chooses path, format, creates needed directories and so on.


This class creates and manages toolbar buttons that you can add to each chat window. It also reacts on menu click by creating new Screenshot objects and delegating all the hard work to them.


This class is as simple as others. It creates ScreenshotTaker widget, waits for screenshot or 'cancel' signal. It can also create widget for cropping image and display it until image is cropped by user. Then it paste result into chat edit window (if not cancelled and contact's max image size is bigger than screenshot size).


This is possibly the most complicated class. It behaves differently depending on screenshot mode. In full-screen modes it is not even shown, it just takes screenshot by using PixmapGrabber static methods and return them to Screenshot class. In window mode it shows itself and allows to drag an icon to any window, then it takes screenshot of that window. I'm not sure if I did it right, maybe some code should be moved to ScreenshotWidget.


The only purpose of this widget is to allow user to select an rectangle of image and crop it. It also displays subwidget with image size (in pixels and kB) and 'Crop' button.


This widgets wraps around CropImageWidget and adds full-screen behaviors to it.


This widgets displays size of image and Crop button.

3. QGraphicsView

Using QGraphicsView allowed me to easily create editable crop rectangle with eight crop handlers.


This is QGraphicsItem subclass that draws four transparent black rectangles (shadow arount crop rectangle).


This is QGraphicsWidget subclass (it can receive mouse events) that draws small white rectangle with black outline. It can be dragged by mouse - that causes crop rect to change. All these items are controlled by CropImageWidget.

4. Summary

As you can see, I was able to split screenshot module to some small classes that can be described by one or two sentences by general. This is something that makes design good - anybody can look into any of these classes and understand them easily and change them. I would be very happy if all kadu modules would be so easy to understand.

Monday, 8 February 2010

Mockups of Chats History Window

Hello again,

Today we present to you two alternative mockups of "Chats History Window". For a long time our users were requesting improvements to History Window (in Polish):
Both mockups try to implement those ideas. It is up to you to decide which approach is better. Feel free to comment on those mockups here (in English) or in this forum post (in Polish).

Mockup 1 - 3 panel mockup: link

Mockup 2 - 2 panel mockup: link

We would love to hear your feedback,

Kadu Usability Team

based on your feedback on our forum we have choosen 3 panel version. It is going to look something like this: link

Tuesday, 19 January 2010

Releases and stuff

A lot has happened since last blog entry. More than 380 commits were submitted and about 10 merge requests were merged (most of them from beevvy) ;) - see our number of clones on gitorious - 9 for now. And will be released very soon.

Regular alpha releases give us more control over what was done and what needs to be done in close future. We are using short TODO lists (polish), so testers know what they should expect in next alpha. Thanks to them a lot of critical (crash) issues were resolved: 0.6.6 is now very usable and I've now got a single crash for whole week (but we really need more testers).

We are getting not only fixes, but also new code (this is just alpha, so no core API changes only) like new emoticons selector (beevvy's work):

and improved expandable contacts list (my and White Eagle work :P):

We now have DBUS module by Uzi (very simple for now, but this will change).

Also history got huge improvements: importing from older versions of Kadu is now about 10-50x faster than before (thanks to sqlite transactions support) and does now blocks Kadu anymore (again, transactions and threading - this is first time I've used producer-consumer pattern in real life). Now I'm working on bringing back status and SMS saving.

Still a lot work has left to do: GUI work (many mockups from our Season of Usability are still not implemented), modules porting, bug fixing, logic fixing and so on. After all that is done we will stop doing alpha releases and start doing beta ones - for bug fixing only.