Unity 8
 All Classes Functions
GreeterContent.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 import AccountsService 0.1
19 import Ubuntu.Components 0.1
20 import LightDM 0.1 as LightDM
21 import "../Components"
22 
23 Item {
24  id: root
25  anchors.fill: parent
26 
27  property bool ready: background.source == "" || background.status == Image.Ready || background.status == Image.Error
28 
29  signal selected(int uid)
30  signal unlocked(int uid)
31 
32  function tryToUnlock() {
33  if (loginLoader.item) {
34  loginLoader.item.tryToUnlock()
35  }
36  }
37 
38  function reset() {
39  if (loginLoader.item) {
40  loginLoader.item.reset()
41  }
42  }
43 
44  Rectangle {
45  // In case background fails to load
46  id: backgroundBackup
47  anchors.fill: parent
48  color: "black"
49  }
50 
51  property url backgroundValue: AccountsService.backgroundFile != undefined && AccountsService.backgroundFile.length > 0 ? AccountsService.backgroundFile : greeter.defaultBackground
52  onBackgroundValueChanged: background.source = backgroundValue
53 
54  CrossFadeImage {
55  id: background
56  objectName: "greeterBackground"
57  anchors {
58  fill: parent
59  topMargin: backgroundTopMargin
60  }
61  fillMode: Image.PreserveAspectCrop
62  // Limit how much memory we'll reserve for this image
63  sourceSize.height: height
64  sourceSize.width: width
65  }
66 
67  // See Shell.qml's backgroundSettings treatment for why we need a separate
68  // Image, but it boils down to avoiding binding loop detection.
69  Image {
70  source: background.source
71  height: 0
72  width: 0
73  sourceSize.height: 0
74  sourceSize.width: 0
75  onStatusChanged: {
76  if (status == Image.Error && source != greeter.defaultBackground) {
77  background.source = greeter.defaultBackground
78  }
79  }
80  }
81 
82  Rectangle {
83  anchors.fill: parent
84  color: "black"
85  opacity: 0.4
86  }
87 
88  Loader {
89  id: loginLoader
90  objectName: "loginLoader"
91  anchors {
92  left: parent.left
93  leftMargin: Math.min(parent.width * 0.16, units.gu(20))
94  verticalCenter: parent.verticalCenter
95  }
96  width: units.gu(29)
97  height: parent.height
98 
99  // TODO: Once we have a system API for determining which mode we are
100  // in, tablet/phone/desktop, that should be used instead of narrowMode.
101  source: greeter.narrowMode ? "" : "LoginList.qml"
102 
103  onLoaded: {
104  item.currentIndex = greeterContentLoader.currentIndex;
105  }
106 
107  Binding {
108  target: loginLoader.item
109  property: "model"
110  value: greeterContentLoader.model
111  }
112 
113  Connections {
114  target: loginLoader.item
115 
116  onSelected: {
117  root.selected(uid);
118  }
119 
120  onUnlocked: {
121  root.unlocked(uid);
122  }
123 
124  onCurrentIndexChanged: {
125  if (greeterContentLoader.currentIndex !== loginLoader.item.currentIndex) {
126  greeterContentLoader.currentIndex = loginLoader.item.currentIndex;
127  }
128  }
129  }
130  }
131 
132  Infographics {
133  id: infographics
134  objectName: "infographics"
135  height: narrowMode ? parent.height : 0.75 * parent.height
136  model: greeterContentLoader.infographicModel
137 
138  property string selectedUser
139  property string infographicUser: AccountsService.statsWelcomeScreen ? selectedUser : ""
140  onInfographicUserChanged: greeterContentLoader.infographicModel.username = infographicUser
141 
142  Component.onCompleted: {
143  selectedUser = greeterContentLoader.model.data(greeterContentLoader.currentIndex, LightDM.UserRoles.NameRole)
144  greeterContentLoader.infographicModel.username = infographicUser
145  greeterContentLoader.infographicModel.readyForDataChange()
146  }
147 
148  Connections {
149  target: root
150  onSelected: infographics.selectedUser = greeterContentLoader.model.data(uid, LightDM.UserRoles.NameRole)
151  }
152 
153  anchors {
154  verticalCenter: parent.verticalCenter
155  left: narrowMode ? root.left : loginLoader.right
156  right: root.right
157  }
158  }
159 
160  Clock {
161  id: clock
162  visible: narrowMode
163 
164  anchors {
165  top: parent.top
166  topMargin: units.gu(2)
167  horizontalCenter: parent.horizontalCenter
168  }
169  }
170 }