kwin/tabbox/itemlayoutconfig.h

427 lines
12 KiB
C++

/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2009 Martin Gräßlin <kde@martin-graesslin.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#ifndef TABBOXITEMLAYOUTCONFIG_H
#define TABBOXITEMLAYOUTCONFIG_H
#include <QList>
#include <QSize>
#include <QString>
/**
* @file
* This file defines the classes ItemLayoutConfig, ItemLayoutConfigRow and
* ItemLayoutConfigRowElement for laying out items in the TabBox.
* Each ItemLayoutConfig contains one to many ItemLayoutConfigRows. Each
* row can again contain one to many ItemLayoutConfigRowElement.
*
* @author Martin Gräßlin <kde@martin-graesslin.com>
* @since 4.4
*/
#include "tabboxconfig.h"
namespace KWin
{
namespace TabBox
{
/**
* This class describes one element of a ItemLayoutConfigRow.
* The element has a type and settings depending on the type.
*
* @author Martin Gräßlin <kde@martin-graesslin.com>
* @since 4.4
*/
class ItemLayoutConfigRowElement
{
public:
/**
* ElementType defines the type of the current element
*/
enum ElementType {
ElementClientName, ///< The element is a TabBoxClient name
ElementDesktopName, ///< The element is a desktop name
ElementIcon, ///< The element is an icon
ElementEmpty, ///< The element is empty, that is a dummy
ElementClientList ///< A complete client list for the desktop
};
ItemLayoutConfigRowElement();
~ItemLayoutConfigRowElement();
/**
* @return The ElementType of this element
*/
ElementType type() const {
return m_type;
}
/**
* @param type Set the ElementType of this element
*/
void setType(ElementType type) {
m_type = type;
}
// TODO: iconSize should be small, normal, large
/**
* @return The size of the icon.
* This option only applies if ElementType is ElementIcon.
*/
QSizeF iconSize() const {
return m_iconSize;
}
/**
* @param size Set the size of the icon.
* This option only applies if ElementType is ElementIcon.
*/
void setIconSize(const QSizeF& size) {
m_iconSize = size;
}
/**
* @returns The text alignment for text elements.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
Qt::Alignment alignment() const {
return m_alignment;
}
/**
* @param alignment Set the text alignment for text elements.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
void setAlignment(Qt::Alignment alignment) {
m_alignment = alignment;
}
/**
* Stretch defines if a text element uses the maximum available size.
* Only one element in a row may have set a stretch and it should be
* the last element.
* @return The element is set to stretch.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
bool isStretch() const {
return m_stretch;
}
/**
* @param stretch Set stretch for the element
* This option only applies if ElementType is ElementClientName or ElementDesktopName
* @see isStretch
*/
void setStretch(bool stretch) {
m_stretch = stretch;
}
/**
* @return True if smallest readable font should be used, false
* for a normal font.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
bool isSmallTextSize() const {
return m_smallTextSize;
}
/**
* @param small Set text element to use smallest readable font.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
void setSmallTextSize(bool small) {
m_smallTextSize = small;
}
/**
* @return Text should be rendered with a bold font.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
bool isBold() const {
return m_bold;
}
/**
* @param bold Set text element to use a bold font or not.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
void setBold(bool bold) {
m_bold = bold;
}
/**
* @return Text should be rendered with an italic font.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
bool isItalic() const {
return m_italic;
}
/**
* @param italic Set text element to use an italic font or not
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
void setItalic(bool italic) {
m_italic = italic;
}
/**
* @return True if an italic font should be used for a minimized client.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
bool isItalicMinimized() const {
return m_italicMinimized;
}
/**
* @param italic Set text element to use an italic font for minimized clients.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
void setItalicMinimized(bool italic) {
m_italicMinimized = italic;
}
/**
* @return A prefix added to the text element.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
QString prefix() const {
return m_prefix;
}
/**
* @param prefix The prefix to be added to the text element
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
void setPrefix(const QString& prefix) {
m_prefix = prefix;
}
/**
* @return A suffix added to the text element.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
QString suffix() const {
return m_suffix;
}
/**
* @param suffix The suffix to be added to the text element
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
void setSuffix(const QString& suffix) {
m_suffix = suffix;
}
/**
* @return A prefix added to the text element of minimized clients.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
QString prefixMinimized() const {
return m_prefixMinimized;
}
/**
* @param prefix The prefix to be added to the text element of minimized clients.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
void setPrefixMinimized(const QString& prefix) {
m_prefixMinimized = prefix;
}
/**
* @return A suffix added to the text element of minimized clients.
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
QString suffixMinimized() const {
return m_suffixMinimized;
}
/**
* @param suffix The suffix to be added to the text element of minimized clients
* This option only applies if ElementType is ElementClientName or ElementDesktopName
*/
void setSuffixMinimzed(const QString& suffix) {
m_suffixMinimized = suffix;
}
/**
* @return The icon element spans all rows.
* This option only applies if ElementType is ElementIcon.
*/
bool isRowSpan() const {
return m_rowSpan;
}
/**
* @param rowSpan The icon element should span all rows or not.
* This option only applies if ElementType is ElementIcon.
*/
void setRowSpan(bool rowSpan) {
m_rowSpan = rowSpan;
}
qreal width() const {
return m_width;
}
void setWidth(qreal width) {
m_width = width;
}
/**
* @return The layout mode for the included client list
* This option only applies if ElementType is ElementClientList
*/
TabBoxConfig::LayoutMode clientListLayoutMode() const {
return m_clientListLayoutMode;
}
/**
* @param mode The layout mode for the included client list
* This option only applies if ElementType is ElementClientList
*/
void setClientListLayoutMode(TabBoxConfig::LayoutMode mode) {
m_clientListLayoutMode = mode;
}
/**
* @return The name of the layout for the included client list
* This option only applies if ElementType is ElementClientList
*/
QString clientListLayoutName() const {
return m_clientListLayoutName;
}
/**
* @param name The name for the layout of the included client list
* This option only applies if ElementType is ElementClientList
*/
void setClientListLayoutName(const QString& name) {
m_clientListLayoutName = name;
}
private:
// type of the current element
ElementType m_type;
// size of the icon if m_type == ElementIcon
QSizeF m_iconSize;
// Text alignment options for m_type != ElementIcon
Qt::Alignment m_alignment;
// element stretches as far as possible
// only one element per row can have this option
bool m_stretch;
/**
* Use smallest readable font or normal font
*/
bool m_smallTextSize;
bool m_bold;
bool m_italic;
/**
* Use italic font if client is minimized
*/
bool m_italicMinimized;
QString m_prefix;
QString m_suffix;
/**
* Prefix to use if client is minimized. E.g. "("
*/
QString m_prefixMinimized;
/**
* Suffix to use if client is minimized. E.g. ")"
*/
QString m_suffixMinimized;
// indicates that the icon spans all rows
bool m_rowSpan;
qreal m_width;
TabBoxConfig::LayoutMode m_clientListLayoutMode;
QString m_clientListLayoutName;
};
/**
* This class describes one row of the ItemLayoutConfig.
* One row consists of one to many ItemlayoutConfigRowElements.
*
* @author Martin Gräßlin <kde@martin-graesslin.com>
* @since 4.4
*/
class ItemLayoutConfigRow
{
public:
ItemLayoutConfigRow();
~ItemLayoutConfigRow();
/**
* @param element The ItemLayoutConfigRowElement to be added to this row.
*/
void addElement(ItemLayoutConfigRowElement element);
/**
* @return The number of ItemLayoutConfigRowElements in this row.
*/
int count() const;
/**
* @param index The element to retrieve
* @return The ItemLayoutConfigRowElement at the given index.
*/
ItemLayoutConfigRowElement element(int index) const;
private:
QList< ItemLayoutConfigRowElement > m_elements;
};
/**
* This class describes the item layout config. It is used by the item delegates
* to calculate the size and render the items.
*
* @author Martin Gräßlin <kde@martin-graesslin.com>
* @since 4.4
*/
class ItemLayoutConfig
{
public:
ItemLayoutConfig();
~ItemLayoutConfig();
/**
* @param row The ItemlayoutConfigRow which should be added to this config
*/
void addRow(ItemLayoutConfigRow row);
/**
* @return The number of ItemLayoutConfigRows.
*/
int count() const;
/**
* @param index The row to retrieve
* @return The ItemLayoutConfigRow at given index.
*/
ItemLayoutConfigRow row(int index) const;
/**
* @return The icon of a selected item should be rendered with a highlight
* icon effect
*/
bool isHighlightSelectedIcons() const {
return m_highlightSelectedIcons;
}
void setHighlightSelectedIcons(bool highlight) {
m_highlightSelectedIcons = highlight;
}
/**
* @return The icon of a not selected item should be rendered with a
* grayscale icon effect.
*/
bool isGrayscaleDeselectedIcons() const {
return m_grayscaleDeselectedIcons;
}
void setGrayscaleDeselectedIcons(bool grayscale) {
m_grayscaleDeselectedIcons = grayscale;
}
private:
QList< ItemLayoutConfigRow > m_rows;
bool m_highlightSelectedIcons;
bool m_grayscaleDeselectedIcons;
};
} //namespace TabBox
} //namespace KWin
#endif // TABBOXITEMLAYOUTCONFIG_H