76f17e6de1
* Models and Delegates for Clients and Desktops * Horizontal, vertical and tabular layout * Layout of one item can be configured by an XML definition * A desktop item can include a client list * An optional second list view showing only the selected item * A new KCM "kwintabbox" * An alternative TabBox with independent settings and keybindings * Optional Highlight Windows effect integration * List scrolls instead of removing items * Scroll wheel support * Cursor key support * Middle click on item closes window BUG: 195745 BUG: 197187 BUG: 201103 FEATURE: 118184 FEATURE: 156723 FEATURE: 177441 FEATURE: 182897 FEATURE: 193882 GUI: svn path=/trunk/KDE/kdebase/workspace/; revision=1022861
355 lines
13 KiB
C++
355 lines
13 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
|