Unity 8
 All Classes Functions Properties
Showable.qml
1 /*
2  * Copyright (C) 2013 Canonical, Ltd.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 3.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  */
16 
17 import QtQuick 2.0
18 
19 Item {
20  id: showable
21 
22  property bool available: true
23  property bool shown: true
24 
25  /* If your showable supports on demand content creation/destruction,
26  set this to false when destroyed and true when ready to be shown.
27  NOTE: You should load your content when "required" is true and
28  destroy when "required" is false
29  */
30  property bool created: true
31  property bool required
32  property bool __shouldShow: false
33  property bool __skipShowAnimation: false
34 
35  property list<QtObject> hides
36  property var showAnimation
37  property var hideAnimation
38 
39  // automatically set the target on showAnimation and hideAnimation to be the
40  // showable itself
41  onShowAnimationChanged: if (showAnimation) showAnimation["target"] = showable
42  onHideAnimationChanged: if (hideAnimation) hideAnimation["target"] = showable
43 
44  Component.onCompleted: required = shown;
45 
46  function __hideOthers() {
47  var i
48  for (i=0; i<hides.length; i++) {
49  hides[i].hide()
50  }
51  }
52 
53  function show() {
54  required = true;
55  if (created) {
56  __reallyShow();
57  } else {
58  __shouldShow = true;
59  }
60  }
61 
62  function showNow() {
63  __skipShowAnimation = true;
64  show();
65  }
66 
67  onCreatedChanged: {
68  if (created && __shouldShow) {
69  __reallyShow();
70  __shouldShow = false;
71  }
72  }
73 
74  function __reallyShow() {
75  if (!available) {
76  __skipShowAnimation = false;
77  return false;
78  }
79 
80  __hideOthers();
81 
82  if (hideAnimation != undefined && hideAnimation.running) {
83  hideAnimation.stop();
84  }
85 
86  if (showAnimation != undefined) {
87  if (!showAnimation.running) {
88  showAnimation.restart()
89  }
90  if (__skipShowAnimation) {
91  showAnimation.complete();
92  }
93  } else {
94  visible = true;
95  }
96 
97  shown = true;
98  __skipShowAnimation = false;
99  return true;
100  }
101 
102  function hide() {
103  if (showAnimation != undefined && showAnimation.running) {
104  showAnimation.stop()
105  }
106  if (hideAnimation != undefined) {
107  if (!hideAnimation.running) {
108  hideAnimation.restart()
109  }
110  } else {
111  visible = false
112  required = false
113  }
114 
115  shown = false
116  }
117 
118  Connections {
119  target: hideAnimation ? hideAnimation: null
120  onRunningChanged: {
121  if (!hideAnimation.running) {
122  required = false;
123  }
124  }
125  }
126 }