From d182406015445ace1cbd45dd3c541a6edd378c15 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 9 Apr 2015 10:44:46 +0200 Subject: [PATCH] Implement OutSideClick --- mix/InverseMouseArea.cpp | 40 ++++++++++++++++++++---------------- mix/InverseMouseArea.h | 9 +++++++- mix/qml/LogsPane.qml | 42 -------------------------------------- mix/qml/StatesComboBox.qml | 38 ++++++++++++++++++++++++++++++---- mix/qml/StatusPane.qml | 11 +++++----- mix/qml/TransactionLog.qml | 3 ++- 6 files changed, 71 insertions(+), 72 deletions(-) diff --git a/mix/InverseMouseArea.cpp b/mix/InverseMouseArea.cpp index 172862038..aa26b4ae5 100644 --- a/mix/InverseMouseArea.cpp +++ b/mix/InverseMouseArea.cpp @@ -30,30 +30,34 @@ using namespace dev::mix; void InverseMouseArea::itemChange(ItemChange _c, const ItemChangeData& _v) { - qDebug() << "itemCHange"; + if (!this->m_active) + return; Q_UNUSED(_v); - - if (_c == ItemSceneChange) - { - + if (_c == ItemSceneChange && window()) window()->installEventFilter(this); - //this->parentItem()->installEventFilter(this); - } - } bool InverseMouseArea::eventFilter(QObject* _obj, QEvent* _ev) { - qDebug() << _ev->type(); + if (!this->m_active) + return false; Q_UNUSED(_obj); - if (_ev->type() == QEvent::MouseButtonPress) - { - qDebug() << "mouse event"; - if (!this->contains(static_cast(_ev)->pos())) - { - qDebug() << "click outside"; - emit clickedOutside(); - } - } + if (_ev->type() == QEvent::MouseButtonPress && !this->contains(static_cast(_ev)->pos())) + emit clickedOutside(); return false; } + +bool InverseMouseArea::contains(const QPoint& _point) const +{ + if (!this->m_active) + return false; + QPointF global = this->parentItem()->mapToItem(0, QPointF(0, 0)); + return QRectF(global.x(), global.y(), this->parentItem()->width(), this->parentItem()->height()).contains(_point); +} + +void InverseMouseArea::setActive(bool _v) +{ + m_active = _v; + if (m_active && window()) + window()->installEventFilter(this); +} diff --git a/mix/InverseMouseArea.h b/mix/InverseMouseArea.h index 8105e03de..42f930ba6 100644 --- a/mix/InverseMouseArea.h +++ b/mix/InverseMouseArea.h @@ -22,6 +22,7 @@ #pragma once +#include #include namespace dev @@ -32,14 +33,20 @@ namespace mix class InverseMouseArea: public QQuickItem { Q_OBJECT + Q_PROPERTY(bool active MEMBER m_active WRITE setActive) public: InverseMouseArea(QQuickItem* _parent = 0): QQuickItem(_parent) {} - ~InverseMouseArea() { /*scene()->removeEventFilter(this);*/ } + ~InverseMouseArea() { if (window()) { window()->removeEventFilter(this); } } + void setActive(bool _v); protected: void itemChange(ItemChange _c, const ItemChangeData& _v); bool eventFilter(QObject* _obj, QEvent *_ev); + bool contains(const QPoint& _point) const; + +private: + bool m_active; signals: void clickedOutside(); diff --git a/mix/qml/LogsPane.qml b/mix/qml/LogsPane.qml index 21e14e817..175f7d96b 100644 --- a/mix/qml/LogsPane.qml +++ b/mix/qml/LogsPane.qml @@ -585,48 +585,6 @@ Rectangle } } } - - Rectangle - { - height: logStyle.generic.layout.headerButtonHeight - anchors.verticalCenter: parent.verticalCenter - color: "transparent" - width: 20 - Button - { - id: hideButton - action: hideAction - anchors.fill: parent - anchors.verticalCenter: parent.verticalCenter - height: 25 - style: - ButtonStyle { - background: - Rectangle { - height: logStyle.generic.layout.headerButtonHeight - implicitHeight: logStyle.generic.layout.headerButtonHeight - color: "transparent" - } - } - } - - Image { - id: hideImage - source: "qrc:/qml/img/exit.png" - anchors.centerIn: parent - fillMode: Image.PreserveAspectFit - width: 20 - height: 25 - } - - Action { - id: hideAction - tooltip: qsTr("Exit") - onTriggered: { - logsPane.parent.toggle(); - } - } - } } } diff --git a/mix/qml/StatesComboBox.qml b/mix/qml/StatesComboBox.qml index bc7a4853d..c3868e3ee 100644 --- a/mix/qml/StatesComboBox.qml +++ b/mix/qml/StatesComboBox.qml @@ -24,13 +24,15 @@ import QtQuick 2.0 import QtQuick.Controls 1.0 import QtQuick.Layouts 1.1 import QtGraphicalEffects 1.0 +import org.ethereum.qml.InverseMouseArea 1.0 Rectangle { id: statesComboBox width: 200 height: 23 - + border.width: 2 + border.color: "red" Component.onCompleted: { var top = dropDownList while (top.parent) { @@ -62,6 +64,12 @@ Rectangle { chosenItemText.text = statesComboBox.items.get(index).title } + function hideDropDown() + { + if (statesComboBox.state === "dropDown") + statesComboBox.state = ""; + } + signal comboClicked property variant colorItem @@ -76,14 +84,13 @@ Rectangle { { id: boldFont } - smooth: true + Rectangle { id: chosenItem width: parent.width height: statesComboBox.height color: statesComboBox.color - Text { id: chosenItemText anchors.left: parent.left @@ -97,7 +104,13 @@ Rectangle { MouseArea { anchors.fill: parent onClicked: { - statesComboBox.state = statesComboBox.state === "dropDown" ? "" : "dropDown" + if (outsideClick.trigerred) + { + outsideClick.trigerred = false; + return; + } + if (statesCombo.state === "") + statesCombo.state = "dropDown"; } } } @@ -124,8 +137,21 @@ Rectangle { anchors.topMargin: 23 color: statesComboBox.color + InverseMouseArea + { + property bool trigerred: false + id: outsideClick + anchors.fill: parent + active: false + onClickedOutside: { + trigerred = true; + statesCombo.hideDropDown() + } + } + ColumnLayout { spacing: 2 + TableView { id: listView height: 20 @@ -256,5 +282,9 @@ Rectangle { height: 20 implicitHeight: (statesComboBox.rowHeight * (statesComboBox.items.count)) } + PropertyChanges { + target: outsideClick + active: true + } } } diff --git a/mix/qml/StatusPane.qml b/mix/qml/StatusPane.qml index 36df419ed..9e10edbe9 100644 --- a/mix/qml/StatusPane.qml +++ b/mix/qml/StatusPane.qml @@ -252,13 +252,9 @@ Rectangle { { id: outsideClick anchors.fill: parent - } - - Connections - { - target: outsideClick + active: false onClickedOutside: { - toggle(); + logsContainer.toggle(); } } @@ -309,11 +305,14 @@ Rectangle { State { name: "opened"; PropertyChanges { target: logsContainer; height: 500; visible: true } + PropertyChanges { target: outsideClick; active: true } + }, State { name: "closed"; PropertyChanges { target: logsContainer; height: 0; visible: false } PropertyChanges { target: statusContainer; width: 600; height: 30 } + PropertyChanges { target: outsideClick; active: false } } ] transitions: Transition { diff --git a/mix/qml/TransactionLog.qml b/mix/qml/TransactionLog.qml index ad97846ae..ca8b37098 100644 --- a/mix/qml/TransactionLog.qml +++ b/mix/qml/TransactionLog.qml @@ -4,6 +4,7 @@ import QtQuick.Controls.Styles 1.1 import QtQuick.Dialogs 1.1 import QtQuick.Layouts 1.1 import org.ethereum.qml.RecordLogEntry 1.0 +import org.ethereum.qml.InverseMouseArea 1.0 Item { property ListModel fullModel: ListModel{} @@ -60,7 +61,7 @@ Item { target: projectModel.stateListModel onStateRun: { if (statesCombo.selectedIndex !== index) - statesCombo.setSelectedIndex( index ); + statesCombo.setSelectedIndex(index) } } }