Nesse artigo, veremos quatro partes de um tema para o KDE que permita criar um ambiente visual homogêneo, que permita que todos os itens da interface tenham um aspecto similar e sejam visualmente agradáveis.
As quatro partes descritas aqui são:
- qstyle: refere-se ao estilo dos itens das janelas, como menus, barras de rolagem, botões, caixas de texto, entre outros.
- Kwin-decoration: o desenho das bordas e barra de titulo das janelas, incluindo os botões minimizar, maximizar e fechar.
- Icones: os ícones que são exibidos na área e trabalho, gerenciadores de arquivos e menu de aplicativos.
- Plasma: O visual da barra e tarefas, menu K e das notificações do sistema, além de alguns widgets que podem ser exibidos na área de trabalho e algumas janelas.
Qstyle
O estilo dos itens das janelas é baseado na superclasse QcommonStyle, sobrescrevendo os métodos responsáveis pelo desenho de cada item, utilizando-se dos métodos da classe Qpainter (um ponteiro para um objeto dessa classe é passado como parâmetro aos métodos responsáveis pelo desenho).
Os métodos que precisam ser sobrecarregados para que se possa criar o visual do seu tema tem todos um formato similar, baseado no operador switch / case. O parâmetro da instrução switch será sempre um identificador cujo tipo tem seu nome associado ao nome da classe (ex.: drawPrimitive usa o tipo PrimitiveElement).
Os métodos de desenho são:
- drawPrimitive
- drawControl
- drawComplexControl
Esses seriam os métodos básicos a serem sobrecarregados. Para ver outros métodos que também podem ser usados, e suas respectivas funções, veja esse artigo.
Kwin-decoration
O estilo das bordas e barra de titulo é criado através do uso de três classes bem curtas, que são derivadas das superclasses KdecorationFactory, KcommonDecorationButton e KcommonDecoration.
A classe derivada de KdecorationFactory, que por convenção é nomeada como <nome do tema>Handler, tem a seguinte estrutura:
class KDE2Handler: public KDecorationFactory
{
public:
KDE2Handler();
~KDE2Handler();
KDecoration* createDecoration( KDecorationBridge* b );
bool reset( unsigned long changed );
virtual QList< BorderSize > borderSizes() const;
virtual bool supports( Ability ability ) const;
private:
unsigned long readConfig( bool update );
void createPixmaps();
void freePixmaps();
void drawButtonBackground(QPixmap *pix,
const QPalette &g, bool sunken);
};
Os métodos importantes aqui, que devem ser sobrecarregados, são:
- readConfig: define se o tema irá ler alguma opção a partir de um arquivo *.conf.
- CreatePixmap: pinta os pixmaps dos botões ao carregar o estilo.
- FreePixmaps: Libera os pixmaps quando não forem mais necessários
- drawButtonBackground: preenchimento dos botões da barra de titulo.
A classe derivada de KcommonDecorationButton, que por convenção é nomeada como <nome do tema>Button, tem a seguinte estrutura:
class KDE2Button : public KCommonDecorationButton
{
public:
KDE2Button(ButtonType type, KDE2Client *parent, const char *name);
~KDE2Button();
void reset(unsigned long changed);
void setBitmap(const unsigned char *bitmap);
protected:
void enterEvent(QEvent *);
void leaveEvent(QEvent *);
void paintEvent(QPaintEvent *);
void drawButton(QPainter *p);
void drawButtonLabel(QPainter*) {;}
QPainterPath* deco;
bool large;
bool isMouseOver;
};
Os métodos importantes aqui, que devem ser sobrecarregados, são:
- setBitmap: ajusta o atributo QpainterEvent que é usado pelo método drawButton.
- drawButton: desenha os botões da barra de titulo.
A classe derivada de KcommonDecoration, que por convenção é nomeada como <nome do tema>Client, tem a seguinte estrutura:
class KDE2Client : public KCommonDecoration
{
public:
KDE2Client( KDecorationBridge* b, KDecorationFactory* f );
~KDE2Client() {;}
virtual QString visibleName() const;
virtual bool decorationBehaviour(DecorationBehaviour behaviour) const;
virtual int layoutMetric(LayoutMetric lm, bool respectWindowState = true, const KCommonDecorationButton * = 0) const;
virtual KCommonDecorationButton *createButton(ButtonType type);
virtual QRegion cornerShape(WindowCorner corner);
void init();
void reset( unsigned long changed );
protected:
void paintEvent( QPaintEvent* );
private:
bool mustDrawHandle() const;
int titleHeight;
};
Os métodos importantes aqui, que devem ser sobrecarregados, são:
- createButton: depende da subclasse derivada de KcommonDecorationButton, retorna os botões da barra de titulo.
- CornerShape: retorna o formato das bordas da janela.
- paintEvent: executa o desenho das bordas com a ajuda de um objeto Qpainter.
Plasma
Um tema para o plasma é um conjunto de arquivos SVG que são utilizados para desenhar a barra de tarefas, o menu K, as notificações do sistema e alguns widget que podem ser exibidos na área de trabalho (como o relógio analógico).
O tema é nada mais nada menos do que um diretório com o nome do tema, contendo três sub-diretórios, sendo que um deles (chamado opaque), é um espelho do conteúdo dos outros dois (dialogue e widgets), com arquivos SVG que possuem características distintas destes últimos.
Uma lista dos arquivos SVG que fazem parte do tema pode ser obtida nesse artigo. Esses arquivos, que podem ser criados em editores de imagens vetoriais como o Inkscape, devem ter cada desenho deles ajustado com um id específico, que também são descritos no artigo mencionado.
Ícones
Um tema de ícones é estruturado como um diretório que contém um arquivo index.theme com a descrição do tema usado pelo módulo específico do systemsettings e os sub-diretórios que contém as imagens dos ícones. Se o tema for baseado no formato de imagem PNG, terá vários sub-diretórios cujo nome é o tamanho do ícone, e dentro deles as categorias dos ícones. Se o tema for baseado no formato SVG, terá um diretório scalable, cujo conteúdo serão as todas categorias existentes.
As categorias de ícones para o KDE são:
- actions
- animations
- apps
- categories
- devices
- emblems
- emotes
- intl
- mimetypes
- places
- plasma apps
- special
- status
Os tamanhos de ícones que podem ser criados, no caso do uso do formato PNG, são:
- 128×128
- 16×16
- 22×22
- 256×256
- 32×32
- 48×48
- 64×64
- 8×8