Development/Architecture/KDE3/Icon Loader

< Development‎ | Architecture/KDE3
Revision as of 20:34, 29 June 2011 by Neverendingo (Talk | contribs) (Text replace - "<code cppqt3>" to "<syntaxhighlight lang="cpp-qt">")

Jump to: navigation, search

Loading and installing icons in KDE

Icons are an important user interface element in any desktop environment. Because of different user preferences and video hardware, one icon may come in different sizes and display depths. In order to make this manageable, a standard way of storing and accessing icons has been developed.

Loading icons

Accessing the iconloader

Icons are loaded using the class KIconLoader. Every KDE appliation has a global iconloader object. You can access this object with:

#include <kglobal.h>
#include <kiconloader.h>
KIconLoader *loader = KGlobal::iconLoader();

===  Loading icons with loadIcon  ===

The iconloader loads icons, transparently '''caches''' them and applies effects.
To load an icon, use the method [ loadIcon()], which is defined like this:

<syntaxhighlight lang="cpp-qt">
QPixmap loadIcon( QString name, int group, int size=0,
                  int state=KIcon::DefaultState, 
                  QString *path_store=0L, bool canReturnNull=false);

As you see, there are a lot of parameters. The first two are most important:

# '''name''' - The name of the icon to load. You must pass the bare icon name here, without extension.
# '''group''' - The icon group. This is explained below.

===  Icon groups  ===

The idea of an ''icon group'' is an important concept in the KDE icon 
scheme.  The icon group denotes where on the screen the icon is going to be used. 
This is relevant because the KDE user can bind icon sizes and visual effects to 
each group. When passing the icon group to the icon loader, you are in fact telling
it which incarnation of the icon to load. And by requiring the group argument, the 
iconloader provides the means to have a consistent and configurable icon look over 
the whole KDE desktop.

For example: The user can configure that he wants 32 pixel icons with 0.2
desaturation for the main toolbars.

The available icon groups are given below. All are defined in the
[ KIcon]
class, so prefix them with ''KIcon::''.

* '''Desktop''' - Icons for use on the desktop, in the filemanager and similar places.
* '''Toolbar''' - Icon for in normal toolbars.
* '''MainToolbar''' - Icons for in the main toolbar. An application can have multiple toolbars, of which one is allways the main toolbar. This typically has entries like "Save" and "Open" and contains larger icons than the other toolbars.
* '''Small''' - Various small icons, like the ones in popup menus, listviews and treelists.
* '''User''' - Special group for loading application specific icons. This is explained in section 3: Installing icons.

So, to load the icon "kfind" for use in the ''Desktop'' group, you'd use:

<syntaxhighlight lang="cpp-qt">
QPixmap icon;
icon = loader->loadIcon("kfind", KIcon::Desktop);

===  loadIcon continued  ===

Now lets discuss the other parameters of ''loadIcon''.

# '''size''' - Override the globally configured size for the specified icon group. Effects bound to the group are still applied.
# '''state''' - The icon state. The icon state is one of ''KIcon::DefaultState'', ''KIcon::ActiveState'' or ''KIcon::DisabledState''. The icon state denotes in which state the icon is. Toolbar buttons, for example, are in state ''active'' if the mouse pointer is above them, in state ''disabled'' when they are not available, and ''default'' otherwise. Each icon state can have different effects assigned to it to give the user visual feedback.
# '''path_store''' - If you want to know where the icon you just loaded is in the filesystem, you can pass a pointer to a QString here and the icon path is stored there.
# '''canReturnNull''' - If the requested icon is not found, the result of ''loadIcon'' depends on this parameter. If ''canReturnNull'' is ''true'', a null pixmap will be returned, if not, the "unknown" icon is returned.

== Installing icons ==

Icons may come in different sizes and display depths.
I shall refer to these icons as ''themed icons''. Icons that come in
just one form are referred to as ''unthemed icons''.

=== Default icon sizes ===

Themed icons come in different sizes and display depths. The standard sizes

;40 Colors
:16x16 pixels
:22x22 pixels
:32x32 pixels

:22x22 pixels
:32x32 pixels
:48x48 pixels

Please refer to the [ KDE icon factory]
for information on which icon sizes are mandatory and more.
Remember that each of these sizes can be bound to an icon group.

=== Icon context ===

Themed icons are stored in a directory hierarchy according to their
'''1. depth''', '''2. size''' and '''3. context'''. 
The term ''context'' is new concept introduced by the KDE icon scheme. 
The context of an icon is what the icon ''means''. The standard 
contexts are given below:

* '''action''' - The icon represents an action in a toolbar, for example "Open" or "Save".
* '''application''' - The icon represents an application, for example "kfind".
* '''device''' - The icon represents something related to a device, for example "floppy" or "mount".
* '''filesystem''' - The icon represents something in the filesystem, for example "directory", "socket" or "trashcan".
* '''mimetype''' - The icon represents an mimetype, for example "text/html".

''Contexts'' are important in one case: selecting an
icon. When an application wants the user to select an icon for, say, a 
toolbar, it would be very user unfriendly to show every single icon
installed in KDE.  Instead, it is much better to let the user select 
an icon from the "action" icons only. These all represent some action and
therefore are suitable for in toolbars.

===  Directory hierarchy  ===

The directory hierarchy in which themed icons are stored follows.
The directory names are self explanatory.


=== Directory roots ===

Themed icons can be installed either globally with respect to KDE, or in
application specific place.  In the global case, the icon theme hierarchy 
resides under {{path|$KDEDIR/share/icons}} while in the application specific
case, it is under {{path|$KDEDIR/share/apps/$APPNAME/icons}}.

=== Installing themed icons ===

The KDE source configuration system (specifically, am_edit) has support for
installing themed icons. First, you have to name your icons in a way that it
is clear where it must be installed. The naming convention is explained in
the table below:

! size
! -
! context
! -
! name
! .png
|| hi || 16 || || action
|| lo || 22 || || app
||    || 32 || || device
||    || 48 || || filesys
||    ||    || || mime



To install these icons globally, add this line to your <tt></tt>.

 KDE_ICON = open kfind

and to install them in an application specific directory, use this:

 icondir = $(kde_datadir)/myapp/icons
 icon_ICON = open kfind

=== Loading themed icons ===
Themed icons are loaded with the iconloader, using the standard icon groups.
For example:

<syntaxhighlight lang="cpp-qt">
QPixmap pm;
pm = loader->loadIcon("kfind", KIcon::Desktop);

This will load the "kfind" icon, of depth and size specified for the
''Desktop'' group.

=== Unthemed icons ===

Unthemed icons are installed in {{path|$KDEDIR/share/apps/$APPNAME/pics}}.
To install them, use this in you <tt></tt>.

 icondir = $(kde_datadir)/myapp/pics
 icon_DATA = open kfind

You must not give the icons special names.
Also, no further processing is done on them: no effects and size,depth selection 
is done.

Unthemed icons can be loaded with the iconloader using the ''User''
group. This will load a user icon:

<syntaxhighlight lang="cpp-qt">
QPixmap pm;
pm = loader->loadIcon("myicon", KIcon::User);

== Conclusion ==
There are 3 ways to install icons: global themed, application
specific themed and unthemed. All types of icons can be loaded with the
iconloader. You should choose a specific installation depending on your

''Initial Author:'' Geert Jansen [ &lt;;]


Content is available under Creative Commons License SA 4.0 unless otherwise noted.