mirror of
https://bitbucket.org/smil3y/kde-workspace.git
synced 2025-02-24 19:02:51 +00:00
173 lines
4.6 KiB
C++
173 lines
4.6 KiB
C++
/*
|
|
Copyright (c) 2008 Ambroz Bizjak <ambro@b4ever.net>
|
|
|
|
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.
|
|
*/
|
|
|
|
#ifndef DESKTOPLAYOUT_H
|
|
#define DESKTOPLAYOUT_H
|
|
|
|
#include <QHash>
|
|
#include <QMap>
|
|
#include <QObject>
|
|
#include <QPropertyAnimation>
|
|
#include <QTransform>
|
|
|
|
#include "itemspace.h"
|
|
|
|
namespace Plasma
|
|
{
|
|
class Animation;
|
|
}
|
|
|
|
class DesktopLayout : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
DesktopLayout ();
|
|
|
|
/**
|
|
* Adds a new item.
|
|
*
|
|
* @param item the item to add
|
|
* @param pushBack if the item should attempt to always be in its preferred position;
|
|
* if false, it will only move when pushed by other items or edges
|
|
* of the working area
|
|
* @param position if the item should be repositioned
|
|
**/
|
|
void addItem(QGraphicsWidget *item, bool pushBack = true, bool position = true);
|
|
|
|
bool getPushBack(int index);
|
|
QPointF getPreferredPosition(int index);
|
|
QRectF getLastGeometry(int index);
|
|
|
|
/**
|
|
* Sets spacing required between an item and
|
|
* the edge of the working area when a new item is positioned.
|
|
**/
|
|
void setPlacementSpacing(qreal spacing);
|
|
|
|
/**
|
|
* Sets spacing between an item and the edge of
|
|
* the working area when items are being pushed around
|
|
* and when an item is moved by the user.
|
|
**/
|
|
void setScreenSpacing(qreal spacing);
|
|
|
|
/**
|
|
* Sets spacing between items when items are being pushed around.
|
|
**/
|
|
void setShiftingSpacing(qreal spacing);
|
|
|
|
/**
|
|
* Sets the tolerance for temporary placement in terms of surface
|
|
* of the item concerned.
|
|
**/
|
|
void setVisibilityTolerance(qreal part);
|
|
|
|
/**
|
|
* Enables or disables temporary placement.
|
|
**/
|
|
void setTemporaryPlacement(bool enabled);
|
|
|
|
/**
|
|
* Sets the alignment.
|
|
* This defines the sides of the working area where items are
|
|
* pushed inside in case the working area shrinks.
|
|
* Default is Qt::AlignTop|Qt::AlignLeft which pushes items on
|
|
* the right and the bottom sides.
|
|
**/
|
|
void setAlignment(Qt::Alignment alignment);
|
|
|
|
/**
|
|
* Call this to change the working area.
|
|
**/
|
|
void setWorkingArea(QRectF area);
|
|
|
|
/**
|
|
* Call this when an item has been moved/resized/transformed either by the user or itself.
|
|
*
|
|
* @param item the item affected
|
|
* @param type whether the change was by the user (ItemTransformUser) or the applet itself (ItemTransformSelf)
|
|
**/
|
|
void itemTransformed(QGraphicsWidget *item);
|
|
|
|
/**
|
|
* Adjusts the items' on-screen positions to match calculations.
|
|
*
|
|
* @param the item to be adjusted. If 0 all the items will be checked.
|
|
**/
|
|
void adjustPhysicalPositions(QGraphicsWidget *item = 0);
|
|
|
|
/**
|
|
* Returns the count of items in the layout.
|
|
**/
|
|
int count() const;
|
|
|
|
/**
|
|
* Returns the applet at the specified position.
|
|
**/
|
|
QGraphicsWidget *itemAt(int index) const;
|
|
|
|
/**
|
|
* Removes the item at the specified position.
|
|
* The ordering of remaining items after removing one is undefined.
|
|
**/
|
|
void removeAt(int index);
|
|
|
|
private slots:
|
|
void movementFinished();
|
|
|
|
private:
|
|
|
|
QRectF positionNewItem(QSizeF itemSize);
|
|
|
|
QRectF transformRect(const QRectF &rect, const QTransform &transform);
|
|
void getItemInstantRelativeGeometry(QGraphicsWidget *item, QRectF &outGeometry, QTransform &outRevertTransform);
|
|
QRectF geometryRelativeToAbsolute(int itemKey, const QRectF &relative);
|
|
QRectF predictNewItemGeometry(const QRectF &logicalGeom);
|
|
|
|
class DesktopLayoutItem
|
|
{
|
|
public:
|
|
QGraphicsWidget *item;
|
|
QRectF temporaryGeometry;
|
|
QTransform revertTransform;
|
|
};
|
|
|
|
int newItemKey();
|
|
|
|
// layout status
|
|
|
|
/**
|
|
* The ItemSpace where items are stored and calculations are done.
|
|
* We use the 'user' item option as an identifier that survives
|
|
* regrouping.
|
|
**/
|
|
ItemSpace itemSpace;
|
|
|
|
/**
|
|
* Item-specific data that cannot be stored in the ItemSpace.
|
|
* Maps integer IDs in the 'user' item field to their local data.
|
|
**/
|
|
QMap<int, DesktopLayoutItem> items;
|
|
|
|
QHash<QObject*, QWeakPointer<QPropertyAnimation> > m_animatingItems;
|
|
QPointF workingStart;
|
|
|
|
// layout configuration
|
|
|
|
bool temporaryPlacement;
|
|
|
|
qreal visibilityTolerance;
|
|
|
|
// item manipulation functions
|
|
void performTemporaryPlacement(int group, int itemInGroup);
|
|
void revertTemporaryPlacement(int group, int itemInGroup);
|
|
};
|
|
|
|
#endif
|