Finished Dock show and hide animation

This commit is contained in:
杨万青 2015-07-15 16:55:16 +08:00
parent dc3acf5c55
commit 3bcfcdd471
4 changed files with 100 additions and 77 deletions

View File

@ -47,6 +47,9 @@ Panel::Panel(QWidget *parent)
}
initAppManager();
initHSManager();
initState();
}
void Panel::showScreenMask()
@ -175,6 +178,70 @@ void Panel::initAppManager()
m_appManager->updateEntries();
}
void Panel::hasShown()
{
m_HSManager->SetState(1);
emit panelHasShown();
}
void Panel::hasHidden()
{
m_HSManager->SetState(3);
emit panelHasHidden();
}
void Panel::hideStateChanged(int value)
{
if (value == 0)
{
emit startShow();
}
else if (value == 1)
{
emit startHide();
}
}
void Panel::initHSManager()
{
m_HSManager = new DBusHideStateManager(this);
connect(m_HSManager,&DBusHideStateManager::ChangeState,this,&Panel::hideStateChanged);
}
void Panel::initState()
{
QStateMachine * machine = new QStateMachine(this);
QState * showState = new QState(machine);
showState->assignProperty(this,"pos",QPoint(0,0));
QState * hideState = new QState(machine);
hideState->assignProperty(this,"pos",QPoint(0,height()));
machine->setInitialState(showState);
QPropertyAnimation *sa = new QPropertyAnimation(this, "pos");
sa->setDuration(200);
sa->setEasingCurve(QEasingCurve::InSine);
connect(sa,&QPropertyAnimation::finished,this,&Panel::hasShown);
QPropertyAnimation *ha = new QPropertyAnimation(this, "pos");
ha->setDuration(200);
ha->setEasingCurve(QEasingCurve::InSine);
connect(ha,&QPropertyAnimation::finished,this,&Panel::hasHidden);
QSignalTransition *ts1 = showState->addTransition(this,SIGNAL(startHide()), hideState);
ts1->addAnimation(ha);
connect(ts1,&QSignalTransition::triggered,[=](int value = 2){
m_HSManager->SetState(value);
});
QSignalTransition *ts2 = hideState->addTransition(this,SIGNAL(startShow()),showState);
ts2->addAnimation(sa);
connect(ts2,&QSignalTransition::triggered,[=](int value = 0){
m_HSManager->SetState(value);
});
machine->start();
}
Panel::~Panel()
{

View File

@ -5,6 +5,7 @@
#include <QLabel>
#include <QPushButton>
#include <QDebug>
#include "DBus/dbushidestatemanager.h"
#include "Controller/dockmodedata.h"
#include "Controller/appmanager.h"
#include "Widgets/appitem.h"
@ -15,6 +16,8 @@
class Panel : public QLabel
{
Q_OBJECT
Q_PROPERTY(QPoint pos READ pos WRITE move)
public:
explicit Panel(QWidget *parent = 0);
~Panel();
@ -27,6 +30,11 @@ public slots:
void slotItemDropped();
void slotEnteredMask();
void slotExitedMask();
signals:
void startShow();
void startHide();
void panelHasShown();
void panelHasHidden();
private slots:
void slotDockModeChanged(Dock::DockMode newMode,Dock::DockMode oldMode);
@ -45,7 +53,14 @@ private:
void showMenu();
void initAppManager();
void hasShown();
void hasHidden();
void hideStateChanged(int value);
void initHSManager();
void initState();
private:
DBusHideStateManager * m_HSManager = NULL;
DockLayout * leftLayout = NULL;
DockLayout *rightLayout = NULL;
AppManager *m_appManager = NULL;

View File

@ -8,6 +8,8 @@ MainWidget::MainWidget(QWidget *parent)
mainPanel = new Panel(this);
mainPanel->resize(this->width(),this->height());
mainPanel->move(0,0);
connect(mainPanel,&Panel::startShow,this,&MainWidget::showDock);
connect(mainPanel,&Panel::panelHasHidden,this,&MainWidget::hideDock);
this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground);
@ -15,13 +17,13 @@ MainWidget::MainWidget(QWidget *parent)
connect(DockModeData::instance(), SIGNAL(dockModeChanged(Dock::DockMode,Dock::DockMode)),
this, SLOT(slotDockModeChanged(Dock::DockMode,Dock::DockMode)));
initHSManager();
initState();
}
void MainWidget::slotDockModeChanged(Dock::DockMode newMode, Dock::DockMode oldMode)
{
if (hasHidden)
return;
QRect rec = QApplication::desktop()->screenGeometry();
this->resize(rec.width(),DockModeData::instance()->getDockHeight());
@ -29,69 +31,19 @@ void MainWidget::slotDockModeChanged(Dock::DockMode newMode, Dock::DockMode oldM
// mainPanel->move(0,0);
}
void MainWidget::hasShown()
{
m_HSManager->SetState(1);
}
void MainWidget::hasHidden()
{
m_HSManager->SetState(3);
}
void MainWidget::hideStateChanged(int value)
{
if (value == 0)
{
emit startShow();
}
else if (value == 1)
{
emit startHide();
}
}
void MainWidget::initHSManager()
{
m_HSManager = new DBusHideStateManager(this);
connect(m_HSManager,&DBusHideStateManager::ChangeState,this,&MainWidget::hideStateChanged);
}
void MainWidget::initState()
void MainWidget::showDock()
{
hasHidden = false;
QRect rec = QApplication::desktop()->screenGeometry();
this->resize(rec.width(),DockModeData::instance()->getDockHeight());
}
//TODO no need "- 100"
QStateMachine * machine = new QStateMachine(this);
QState * showState = new QState(machine);
showState->assignProperty(this,"pos",QPoint(rec.x(),rec.height() - DockModeData::instance()->getDockHeight() - 100));
QState * hideState = new QState(machine);
hideState->assignProperty(this,"pos",QPoint(rec.x(),rec.height() - 100));
machine->setInitialState(showState);
QPropertyAnimation *sa = new QPropertyAnimation(this, "pos");
sa->setDuration(200);
sa->setEasingCurve(QEasingCurve::InSine);
connect(sa,&QPropertyAnimation::finished,this,&MainWidget::hasShown);
QPropertyAnimation *ha = new QPropertyAnimation(this, "pos");
ha->setDuration(200);
ha->setEasingCurve(QEasingCurve::InSine);
connect(ha,&QPropertyAnimation::finished,this,&MainWidget::hasHidden);
QSignalTransition *ts1 = showState->addTransition(this,SIGNAL(startHide()), hideState);
ts1->addAnimation(ha);
connect(ts1,&QSignalTransition::triggered,[=](int value = 2){
m_HSManager->SetState(value);
});
QSignalTransition *ts2 = hideState->addTransition(this,SIGNAL(startShow()),showState);
ts2->addAnimation(sa);
connect(ts2,&QSignalTransition::triggered,[=](int value = 0){
m_HSManager->SetState(value);
});
machine->start();
void MainWidget::hideDock()
{
hasHidden = true;
QRect rec = QApplication::desktop()->screenGeometry();
//set height with 0 mean window is hidden,Windows manager will handle it's showing animation
this->resize(rec.width(),1);
}
MainWidget::~MainWidget()

View File

@ -9,16 +9,12 @@
#include <QState>
#include <QPropertyAnimation>
#include <QDebug>
#include "DBus/dbushidestatemanager.h"
#include "Controller/dockmodedata.h"
#include "Panel/panel.h"
class MainWidget : public QWidget
{
Q_OBJECT
Q_PROPERTY(QSize size READ size WRITE resize)
Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry)
Q_PROPERTY(QPoint pos READ pos WRITE move)
public:
MainWidget(QWidget *parent = 0);
@ -27,20 +23,13 @@ public:
public slots:
void slotDockModeChanged(Dock::DockMode newMode,Dock::DockMode oldMode);
signals:
void startShow();
void startHide();
private:
void hasShown();
void hasHidden();
void hideStateChanged(int value);
void initHSManager();
void initState();
void showDock();
void hideDock();
private:
Panel *mainPanel = NULL;
DBusHideStateManager * m_HSManager = NULL;
bool hasHidden = false;
};
#endif // MAINWIDGET_H