Skip to content

Commit

Permalink
feat: add hold container
Browse files Browse the repository at this point in the history
wrappers can be drop into hold container from normal container,
of course, wrappers in hold container can also be drop into normal container

Change-Id: I21013beede7661507a9c389af21c35692b777dd4
  • Loading branch information
listenerri committed Dec 28, 2018
1 parent 7c1ae86 commit fea6074
Show file tree
Hide file tree
Showing 13 changed files with 312 additions and 39 deletions.
62 changes: 56 additions & 6 deletions plugins/tray/fashiontray/containers/abstractcontainer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ AbstractContainer::AbstractContainer(TrayPlugin *trayPlugin, QWidget *parent)
m_dockPosition(Dock::Position::Bottom),
m_wrapperSize(QSize(TrayWidgetWidthMin, TrayWidgetHeightMin))
{
setAcceptDrops(true);

m_wrapperLayout->setMargin(0);
m_wrapperLayout->setContentsMargins(0, 0, 0, 0);
m_wrapperLayout->setSpacing(TraySpace);
Expand All @@ -22,10 +24,6 @@ AbstractContainer::AbstractContainer(TrayPlugin *trayPlugin, QWidget *parent)

void AbstractContainer::addWrapper(FashionTrayWidgetWrapper *wrapper)
{
if (!acceptWrapper(wrapper)) {
return;
}

if (containsWrapper(wrapper)) {
return;
}
Expand Down Expand Up @@ -78,6 +76,10 @@ FashionTrayWidgetWrapper *AbstractContainer::takeWrapper(FashionTrayWidgetWrappe
return nullptr;
}

if (m_currentDraggingWrapper == wrapper) {
m_currentDraggingWrapper = nullptr;
}

wrapper->disconnect();
m_wrapperLayout->removeWidget(wrapper);
m_wrapperList.removeAll(wrapper);
Expand Down Expand Up @@ -173,7 +175,7 @@ bool AbstractContainer::isEmpty()
bool AbstractContainer::containsWrapper(FashionTrayWidgetWrapper *wrapper)
{
for (auto w : m_wrapperList) {
if (w->absTrayWidget() == wrapper->absTrayWidget()) {
if (w == wrapper) {
return true;
}
}
Expand Down Expand Up @@ -201,6 +203,24 @@ FashionTrayWidgetWrapper *AbstractContainer::wrapperByTrayWidget(AbstractTrayWid
return nullptr;
}

void AbstractContainer::addDraggingWrapper(FashionTrayWidgetWrapper *wrapper)
{
addWrapper(wrapper);

if (containsWrapper(wrapper)) {
m_currentDraggingWrapper = wrapper;
}
}

FashionTrayWidgetWrapper *AbstractContainer::takeDraggingWrapper()
{
if (!m_currentDraggingWrapper) {
return nullptr;
}

return takeWrapper(m_currentDraggingWrapper);
}

int AbstractContainer::whereToInsert(FashionTrayWidgetWrapper *wrapper)
{
if (m_wrapperList.isEmpty()) {
Expand Down Expand Up @@ -245,6 +265,14 @@ QBoxLayout *AbstractContainer::wrapperLayout() const
return m_wrapperLayout;
}

// replace current WrapperLayout by "layout"
// but will not setLayout here, so the caller should handle the new WrapperLayout
void AbstractContainer::setWrapperLayout(QBoxLayout *layout)
{
delete m_wrapperLayout;
m_wrapperLayout = layout;
}

bool AbstractContainer::expand() const
{
return m_expand;
Expand All @@ -260,6 +288,17 @@ QSize AbstractContainer::wrapperSize() const
return m_wrapperSize;
}

void AbstractContainer::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat(TRAY_ITEM_DRAG_MIMEDATA) && !m_currentDraggingWrapper) {
event->accept();
Q_EMIT requestDraggingWrapper();
return;
}

QWidget::dragEnterEvent(event);
}

void AbstractContainer::onWrapperAttentionhChanged(const bool attention)
{
FashionTrayWidgetWrapper *wrapper = dynamic_cast<FashionTrayWidgetWrapper *>(sender());
Expand Down Expand Up @@ -302,10 +341,21 @@ void AbstractContainer::onWrapperRequestSwapWithDragging()
{
FashionTrayWidgetWrapper *wrapper = static_cast<FashionTrayWidgetWrapper *>(sender());

if (!wrapper || !m_currentDraggingWrapper || wrapper == m_currentDraggingWrapper) {
if (!wrapper || wrapper == m_currentDraggingWrapper) {
return;
}

// the current dragging wrapper is null means that the dragging wrapper is contains by
// another container, so this container need to emit requireDraggingWrapper() signal
// to notify FashionTrayItem, the FashionTrayItem will move the dragging wrapper to this container
if (!m_currentDraggingWrapper) {
Q_EMIT requestDraggingWrapper();
// here have to give up if dragging wrapper is still null
if (!m_currentDraggingWrapper) {
return;
}
}

const int indexOfDest = m_wrapperLayout->indexOf(wrapper);
const int indexOfDragging = m_wrapperLayout->indexOf(m_currentDraggingWrapper);

Expand Down
8 changes: 8 additions & 0 deletions plugins/tray/fashiontray/containers/abstractcontainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,27 @@ class AbstractContainer : public QWidget
bool containsWrapperByTrayWidget(AbstractTrayWidget *trayWidget);
FashionTrayWidgetWrapper *wrapperByTrayWidget(AbstractTrayWidget *trayWidget);

void addDraggingWrapper(FashionTrayWidgetWrapper *wrapper);
FashionTrayWidgetWrapper *takeDraggingWrapper();

Q_SIGNALS:
void attentionChanged(FashionTrayWidgetWrapper *wrapper, const bool attention);
void requestDraggingWrapper();

protected:
virtual int whereToInsert(FashionTrayWidgetWrapper *wrapper);

TrayPlugin *trayPlugin() const;
QList<QPointer<FashionTrayWidgetWrapper>> wrapperList() const;
QBoxLayout *wrapperLayout() const;
void setWrapperLayout(QBoxLayout *layout);
bool expand() const;
Dock::Position dockPosition() const;
QSize wrapperSize() const;

protected:
void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE;

private Q_SLOTS:
void onWrapperAttentionhChanged(const bool attention);
void onWrapperDragStart();
Expand Down
104 changes: 103 additions & 1 deletion plugins/tray/fashiontray/containers/holdcontainer.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,108 @@
#include "holdcontainer.h"
#include "../fashiontrayconstants.h"

HoldContainer::HoldContainer(QWidget *parent) : QWidget(parent)
HoldContainer::HoldContainer(TrayPlugin *trayPlugin, QWidget *parent)
: AbstractContainer(trayPlugin, parent),
m_mainBoxLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight)),
m_holdSpliter(new QLabel)
{
m_holdSpliter->setStyleSheet("background-color: rgba(255, 255, 255, 0.1);");

m_mainBoxLayout->setMargin(0);
m_mainBoxLayout->setContentsMargins(0, 0, 0, 0);
m_mainBoxLayout->setSpacing(TraySpace);

QBoxLayout *preLayout = wrapperLayout();
QBoxLayout *newLayout = new QBoxLayout(QBoxLayout::Direction::LeftToRight);
for (int i = 0; i < preLayout->count(); ++i) {
newLayout->addItem(preLayout->takeAt(i));
}
setWrapperLayout(newLayout);

m_mainBoxLayout->addWidget(m_holdSpliter);
m_mainBoxLayout->addLayout(newLayout);

m_mainBoxLayout->setAlignment(m_holdSpliter, Qt::AlignCenter);
m_mainBoxLayout->setAlignment(newLayout, Qt::AlignCenter);

setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
setLayout(m_mainBoxLayout);
}

bool HoldContainer::acceptWrapper(FashionTrayWidgetWrapper *wrapper)
{
const QString &key = wrapper->itemKey() + HoldKeySuffix;
return trayPlugin()->getValue(wrapper->itemKey(), key, false).toBool();
}

void HoldContainer::addWrapper(FashionTrayWidgetWrapper *wrapper)
{
AbstractContainer::addWrapper(wrapper);

if (containsWrapper(wrapper)) {
const QString &key = wrapper->itemKey() + HoldKeySuffix;
trayPlugin()->saveValue(wrapper->itemKey(), key, true);
}
}

void HoldContainer::refreshVisible()
{
setVisible(expand() || !isEmpty());
}

void HoldContainer::setDockPosition(const Dock::Position pos)
{
if (pos == Dock::Position::Top || pos == Dock::Position::Bottom) {
m_mainBoxLayout->setDirection(QBoxLayout::Direction::LeftToRight);
} else{
m_mainBoxLayout->setDirection(QBoxLayout::Direction::TopToBottom);
}

AbstractContainer::setDockPosition(pos);
}

void HoldContainer::setExpand(const bool expand)
{
m_holdSpliter->setVisible(expand);

AbstractContainer::setExpand(expand);
}

QSize HoldContainer::totalSize() const
{
QSize size = AbstractContainer::totalSize();

if (expand()) {
if (dockPosition() == Dock::Position::Top || dockPosition() == Dock::Position::Bottom) {
size.setWidth(
size.width()
+ SpliterSize
+ TraySpace
);
size.setHeight(height());
} else {
size.setWidth(width());
size.setHeight(
size.height()
+ SpliterSize
+ TraySpace
);
}
}

return size;
}

void HoldContainer::resizeEvent(QResizeEvent *event)
{
const QSize &mSize = event->size();
const Dock::Position dockPosition = trayPlugin()->dockPosition();

if (dockPosition == Dock::Position::Top || dockPosition == Dock::Position::Bottom) {
m_holdSpliter->setFixedSize(SpliterSize, mSize.height() * 0.3);
} else{
m_holdSpliter->setFixedSize(mSize.width() * 0.3, SpliterSize);
}

AbstractContainer::resizeEvent(event);
}
23 changes: 17 additions & 6 deletions plugins/tray/fashiontray/containers/holdcontainer.h
Original file line number Diff line number Diff line change
@@ -1,17 +1,28 @@
#ifndef HOLDCONTAINER_H
#define HOLDCONTAINER_H

#include <QWidget>
#include "abstractcontainer.h"

class HoldContainer : public QWidget
class HoldContainer : public AbstractContainer
{
Q_OBJECT
public:
explicit HoldContainer(QWidget *parent = nullptr);
explicit HoldContainer(TrayPlugin *trayPlugin, QWidget *parent = nullptr);

signals:
public:
bool acceptWrapper(FashionTrayWidgetWrapper *wrapper) Q_DECL_OVERRIDE;
void addWrapper(FashionTrayWidgetWrapper *wrapper) Q_DECL_OVERRIDE;
void refreshVisible() Q_DECL_OVERRIDE;
void setDockPosition(const Dock::Position pos) Q_DECL_OVERRIDE;
void setExpand(const bool expand) Q_DECL_OVERRIDE;
QSize totalSize() const Q_DECL_OVERRIDE;

protected:
void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;

public slots:
private:
QBoxLayout *m_mainBoxLayout;
QLabel *m_holdSpliter;
};

#endif // HOLDCONTAINER_H
#endif // HOLDCONTAINER_H
11 changes: 11 additions & 0 deletions plugins/tray/fashiontray/containers/normalcontainer.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "normalcontainer.h"
#include "../fashiontrayconstants.h"

NormalContainer::NormalContainer(TrayPlugin *trayPlugin, QWidget *parent)
: AbstractContainer(trayPlugin, parent)
Expand All @@ -13,6 +14,16 @@ bool NormalContainer::acceptWrapper(FashionTrayWidgetWrapper *wrapper)
return true;
}

void NormalContainer::addWrapper(FashionTrayWidgetWrapper *wrapper)
{
AbstractContainer::addWrapper(wrapper);

if (containsWrapper(wrapper)) {
const QString &key = wrapper->itemKey() + HoldKeySuffix;
trayPlugin()->saveValue(wrapper->itemKey(), key, false);
}
}

void NormalContainer::refreshVisible()
{
setVisible(expand() && !isEmpty());
Expand Down
1 change: 1 addition & 0 deletions plugins/tray/fashiontray/containers/normalcontainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class NormalContainer : public AbstractContainer
// AbstractContainer interface
public:
bool acceptWrapper(FashionTrayWidgetWrapper *wrapper) Q_DECL_OVERRIDE;
void addWrapper(FashionTrayWidgetWrapper *wrapper) Q_DECL_OVERRIDE;
void refreshVisible() Q_DECL_OVERRIDE;
void setExpand(const bool expand) Q_DECL_OVERRIDE;

Expand Down
3 changes: 3 additions & 0 deletions plugins/tray/fashiontray/fashiontrayconstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ namespace Dock {
#define TrayWidgetWidthMin 24
#define TrayWidgetHeightMin 24


#define HoldKeySuffix "-holded"

}

#endif // FASHIONTRAYCONSTANTS_H
Loading

0 comments on commit fea6074

Please sign in to comment.