-
Notifications
You must be signed in to change notification settings - Fork 0
/
Start.qml
244 lines (200 loc) · 10.2 KB
/
Start.qml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
/*
by sanekyy
Пустая стартовая страничка, при необходимости отображает пустой ActionBar
для перехода между страницами без мелькатия пустого экрана.
Палень навигации недоступна.
При создании этой страницы вызывается функция start(), в которой инициализируются
необходимые глобальные переменные ( A.dialog=dialog ), для доступа из любого файла/модуля.
Так же в зависимости от настроек пользователя и приложения производится открытие страницы для входа
или же открывается лента.
Описаны:
NavigationDrawer - панель навигации ( выдвигающееся меню слева ( гамбургер ) )
VisualDataModel - модель, в которой описаны элементы панели навигации
*/
import QtQuick 2.2
import QuickAndroid 0.1
import QuickAndroid.Styles 0.1
import "../items"
Page {
id: startPage
objectName: "StartPage"
// Массив страниц для панели навигации
property var pages: [
{
publicName: "Lenta", pageName: "Lenta", objectName: "LentaPage",
},
{
publicName: "New Post", pageName: "NewPost", objectName: "NewPostPage",
},
{
publicName: "My Page", pageName: "My", objectName: "MyPage",
}
];
// При переходе между Login->SignUp бар не должно быть видно, однако видно при переходе например
// между Lenta->NewPost с помощью панели навигации, для незаметного переключения страниц
property bool actionBarVisible:false
// Вызывается при запуске приложения
function start(){
// инициализация "глобальных" переменных
A.startPage=startPage;
A.pageStack=startPage.parent;
A.settings=settings;
A.dialog=dialog;
// Выводим в лог все настройки
console.log('serverIp:', A.serverIp);
console.log('serverPort:', A.serverPort);
console.log('loggined:', A.settings.loggined);
console.log('username:', A.settings.username);
console.log('password:', A.settings.password);
console.log('userId:', A.settings.userId);
console.log('session:', A.settings.session);
console.log('accessTokenVk:', A.settings.accessTokenVk);
// если залогинен, login(), иначе открываем страницу для входа
if (A.settings.loggined&&A.settings.accessTokenVk===""){
login( A.settings.username, A.settings.password);
}
else if(A.settings.accessTokenVk!==""){
while(A.pageStack.count>1)
A.pageStack.pop(false);
present(Qt.resolvedUrl("Lenta.qml"));
// Запуск таймера, как только лента откроется, actionBarVisible=true;
visibleOnActionBar();
}
else{
present(Qt.resolvedUrl('./Login.qml'));
}
}
// аутентификация пользователя на сервере, при положетильном ответе открываем ленту
function login(username, password) {
// Создаём json для запроса к серверу
var jsonReq = JSON.stringify({username: username, password: password});
// Создаём http объект, открываем и настраиваем запрос, отправляем json
var request = new XMLHttpRequest();
request.open("POST", "http://" + A.serverIp + ":" + A.serverPort + "/login");;
request.setRequestHeader('Content-Type', 'application/json');
request.setRequestHeader('Content-Length', jsonReq.length);
request.send(jsonReq);
// Следим за изменением состояния запроса
request.onreadystatechange = function() {
if (request.readyState == request.DONE) { // Запрос выполнен?
if(request.status && request.status === 200){ // Успешкое выполнение?
if(request.getResponseHeader('Content-Type')==='application/json; charset=utf-8'){
var jsonRes = JSON.parse(request.responseText);
if (!jsonRes.err){ // Проверяем на отсутствие ошибки
// Записываем настройки
A.settings.userId=jsonRes.userId;
A.settings.username=username;
A.settings.password=password;
A.settings.loggined=true;
//settings.session=jsonRes.session;
// Очищаем стек страниц ( например, если открыта LoginPage )
while(A.pageStack.count>1)
A.pageStack.pop(false);
present(Qt.resolvedUrl("Lenta.qml"));
// Запуск таймера, как только лента откроется, actionBarVisible=true;
visibleOnActionBar();
return;
}
// Обработка ошибки, сообщение пользователю...
A.openDialog("Login", jsonRes.err.description, "OK");
return
}
}
// Если запрос выполнен, но сервер не ответил кодом 200 ( 200 - успешное выполнение )
A.openDialog("Error", "Server don't answer", "OK");
console.log('Server error');
}
};
}
// Рекурсивный таймер, проверяет каждые 100мс состояние PageStack
// Если running=false, значит Lenta открылась и ActionBar можно показывать
function visibleOnActionBar(){
A.setTimeout(function(){
if(A.pageStack.running)
visibleOnActionBar();
else
A.startPage.actionBarVisible=true;
}, 100);
}
// Открывает панель навигации
function openNavigationDrawer(){
navigation.show();
}
// ActionBar для отсутствия белого экрана при переключении между экранами
actionBar: ActionBar {
id: actionBar
upEnabled: true
visible:actionBarVisible
title: qsTr("")
showTitle: true
iconSource: A.pageStack.count>2? A.drawable("ic_arrow_back",Constants.black87):A.drawable("ic_menu",Constants.black87)
//onActionButtonClicked:{ A.pageStack.count>2? back():A.startPage.openNavigationDrawer();}
z: 10
}
NavigationDrawer { // Боковое меню слева
id: navigation
parent: A.pageStack.topPage
// Список пунктов меню
ListView {
id:pagesList
width:parent.width
height: parent.height - logOutButtom.height
z:parent.z
model: visualDataModel
}
// Log Out Button
RaisedButton{
id: logOutButtom
text: "Log out"
height: 35*A.dp
width: parent.width
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: pagesList.bottom
z:parent.z
onClicked:{
navigation.hide();
// Сбрасываем все настройки закрываем все страницы и открываем LoginPage
A.settings.loggined=false;
A.settings.username="";
A.settings.password="";
A.startPage.actionBarVisible=false;
A.settings.accessTokenVk="";
while(A.pageStack.count>1)
pop(false);
present(Qt.resolvedUrl('./Login.qml'));
}
}
}
// Визуальная модель списока пунктов меню в панели навигации
VisualDataModel{
id: visualDataModel
delegate: ListItem{
title: modelData.publicName
onClicked: {
navigation.hide();
// Если это та же самая страница, ничего не делаем
if(A.pageStack.topPage.objectName===(modelData.objectName))
return;
// Проверяем, есть ли уже данная страница в стеке
var isClicedPageInStack=false;
for (var i=0; i<A.pageStack.count; i++){
if (A.pageStack.pages[i].objectName===(modelData.objectName)){
isClicedPageInStack=true;
break;
}
}
// Если страница есть в стеке, закрываем страницы пока не дойдёт до выбранной
if(isClicedPageInStack){
while(A.pageStack.count>(i+1))
A.pageStack.pop(false);
return;
}
// Если страница ещё не открыта очищаем стек страниц и открываем выбранную
while (A.pageStack.count>1)
A.pageStack.pop(false);
present(Qt.resolvedUrl(modelData.pageName+".qml"),{}, false);
}
}
model:pages
}
}