Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
Toggle main menu visibility
Loading...
Searching...
No Matches
router.cpp
Go to the documentation of this file.
1
/*
2
* Copyright 2020 Twilight
3
*
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
7
*
8
* http://www.apache.org/licenses/LICENSE-2.0
9
*
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
15
*/
16
22
23
#include "
./router.h
"
24
25
#include <QCoreApplication>
26
27
Screen::Screen
() {}
28
Screen::Screen
(
bool
modal
, QString
title
, QString
url
,
bool
homeBtn
)
29
:
modal
(
modal
),
30
title
(
title
),
31
url
(
url
),
32
homeBtn
(
homeBtn
)
33
{}
34
35
void
Router::changeScreen
(QString name)
36
{
37
// Get screen, if invalid load invalid screen
38
auto
scrn =
screens
.value(name,
nullptr
);
39
if
(scrn ==
nullptr
) {
40
scrn =
screens
.value(
""
);
41
name =
""
;
42
}
43
44
// Only set title if non-modal screen
45
// Otherwise this causes a momentary flicker on the title where it changes
46
// to the modal title briefly before displaying modal which looks very odd
47
if
(!scrn->modal) {
48
title
= QCoreApplication::translate(
"Screen"
, scrn->title.toUtf8().constData());
49
titleChanged();
50
}
51
52
// If invalid screen, stop here
53
if
(name ==
""
)
54
return
;
55
56
// If Home Screen, issue a special signal notifying to pop all elements off
57
else
if
(name ==
"home"
)
58
goHome();
59
60
// Otherwise notify to open a modal or non-modal screen
61
else
if
(scrn->modal)
62
openModal(scrn->url);
63
else
64
openNonModal(scrn->url);
65
66
// If the home screen it means clear everything first because that's what the
67
// UI did
68
if
(name ==
"home"
)
69
stack
.clear();
70
71
homeBtnShown
= scrn->homeBtn;
72
73
// Append new screen
74
stack
.append(scrn);
75
homeBtnShownChanged();
76
}
77
78
void
Router::closeScreen
()
79
{
80
// Do nothin if we're at root screen or no screen at all
81
if
(
stack
.size() <= 1)
82
return
;
83
84
// Get current screen
85
Screen
* scrn =
stack
.last();
86
87
// If an error happened and we're unable to retrive screen data also return
88
if
(scrn ==
nullptr
)
89
return
;
90
91
// Figure out if it's modal or not and issue close statement accordingly
92
if
(scrn->
modal
)
93
closeModal();
94
else
95
closeNonModal();
96
97
// Pop screen and get new screen
98
stack
.pop_back();
99
scrn =
stack
.last();
100
101
// Only set title if non-modal screen
102
// Otherwise this causes a momentary flicker on the title where it changes
103
// to the modal title briefly before displaying modal which looks very odd
104
if
(!scrn->
modal
) {
105
title
= QCoreApplication::translate(
"Screen"
, scrn->
title
.toUtf8().constData());
106
titleChanged();
107
}
108
109
homeBtnShown
= scrn->
homeBtn
;
110
111
homeBtnShownChanged();
112
}
113
114
void
Router::manualStackPush
(QString name)
115
{
116
// Get screen, if invalid load invalid screen
117
auto
scrn =
screens
.value(name,
nullptr
);
118
if
(scrn ==
nullptr
) {
119
scrn =
screens
.value(
""
);
120
name =
""
;
121
}
122
123
// If invalid screen, stop here
124
if
(name ==
""
)
125
return
;
126
127
if
(!scrn->modal) {
128
title
= QCoreApplication::translate(
"Screen"
, scrn->title.toUtf8().constData());
129
titleChanged();
130
}
131
132
homeBtnShown
= scrn->homeBtn;
133
134
// Append new screen
135
stack
.append(scrn);
136
homeBtnShownChanged();
137
}
138
139
void
Router::loadScreens
()
140
{
141
// Empty
142
screens
.insert(
""
,
new
Screen
);
143
144
// Modal. Titles are marked with QT_TRANSLATE_NOOP so lupdate extracts them
145
// (context "Screen"); they're stored as the en_US source here and translated
146
// at point of use (see changeScreen) — loadScreens runs at boot before the
147
// translator is installed, so they must not be translated eagerly.
148
screens
.insert(
"newFile"
,
new
Screen
(
true
, QT_TRANSLATE_NOOP(
"Screen"
,
"New File"
),
"qrc:/ui/app/screens/modal/NewFile.qml"
));
149
screens
.insert(
"fileTools"
,
new
Screen
(
true
, QT_TRANSLATE_NOOP(
"Screen"
,
"File Tools"
),
"qrc:/ui/app/screens/modal/FileTools.qml"
));
150
screens
.insert(
"about"
,
new
Screen
(
true
, QT_TRANSLATE_NOOP(
"Screen"
,
"About"
),
"qrc:/ui/app/screens/modal/About.qml"
));
151
screens
.insert(
"fullKeyboard"
,
new
Screen
(
true
, QT_TRANSLATE_NOOP(
"Screen"
,
"Full Keyboard"
),
"qrc:/ui/app/screens/modal/FullKeyboard.qml"
));
152
screens
.insert(
"fileError"
,
new
Screen
(
true
, QT_TRANSLATE_NOOP(
"Screen"
,
"File Error"
),
"qrc:/ui/app/screens/modal/FileError.qml"
));
153
154
// Non-Modal
155
screens
.insert(
"home"
,
new
Screen
(
false
, QT_TRANSLATE_NOOP(
"Screen"
,
"Home"
),
"qrc:/ui/app/screens/non-modal/Home.qml"
));
156
screens
.insert(
"trainerCard"
,
new
Screen
(
false
, QT_TRANSLATE_NOOP(
"Screen"
,
"Trainer Card"
),
"qrc:/ui/app/screens/non-modal/TrainerCard.qml"
));
157
screens
.insert(
"pokedex"
,
new
Screen
(
false
, QT_TRANSLATE_NOOP(
"Screen"
,
"Pokédex"
),
"qrc:/ui/app/screens/non-modal/Pokedex.qml"
));
158
screens
.insert(
"bag"
,
new
Screen
(
false
, QT_TRANSLATE_NOOP(
"Screen"
,
"Items"
),
"qrc:/ui/app/screens/non-modal/Bag.qml"
));
159
screens
.insert(
"pokemart"
,
new
Screen
(
false
, QT_TRANSLATE_NOOP(
"Screen"
,
"Market"
),
"qrc:/ui/app/screens/non-modal/Pokemart.qml"
));
160
screens
.insert(
"pokemon"
,
new
Screen
(
false
, QT_TRANSLATE_NOOP(
"Screen"
,
"Pokémon"
),
"qrc:/ui/app/screens/non-modal/Pokemon.qml"
));
161
screens
.insert(
"pokemonDetails"
,
new
Screen
(
false
, QT_TRANSLATE_NOOP(
"Screen"
,
"Pokémon Details"
),
"qrc:/ui/app/screens/non-modal/PokemonDetails.qml"
,
false
));
162
screens
.insert(
"rival"
,
new
Screen
(
false
, QT_TRANSLATE_NOOP(
"Screen"
,
"Rival"
),
"qrc:/ui/app/screens/non-modal/Rival.qml"
));
163
screens
.insert(
"maps"
,
new
Screen
(
false
, QT_TRANSLATE_NOOP(
"Screen"
,
"Maps"
),
"qrc:/ui/app/screens/non-modal/Maps.qml"
));
164
screens
.insert(
"mapDetails"
,
new
Screen
(
false
, QT_TRANSLATE_NOOP(
"Screen"
,
"Map Details"
),
"qrc:/ui/app/screens/non-modal/MapDetails.qml"
,
false
));
165
}
166
167
QHash<QString, Screen*>
Router::screens
= QHash<QString, Screen*>();
168
QVector<Screen*>
Router::stack
= QVector<Screen*>();
Router::loadScreens
static void loadScreens()
Register the app's screen set (called at boot).
Definition
router.cpp:139
Router::manualStackPush
void manualStackPush(QString name)
StackView-internal: push name without side effects.
Definition
router.cpp:114
Router::changeScreen
void changeScreen(QString name)
Navigate to the registered screen name.
Definition
router.cpp:35
Router::stack
static QVector< Screen * > stack
The live navigation stack.
Definition
router.h:103
Router::closeScreen
void closeScreen()
Close the top screen.
Definition
router.cpp:78
Router::screens
static QHash< QString, Screen * > screens
The registry of named screens.
Definition
router.h:104
Router::title
QString title
Definition
router.h:98
Router::homeBtnShown
bool homeBtnShown
Definition
router.h:99
router.h
Screen
One registered screen: its QML url, title, and modal/home-button flags.
Definition
router.h:32
Screen::homeBtn
bool homeBtn
Definition
router.h:59
Screen::title
QString title
Definition
router.h:54
Screen::modal
bool modal
Definition
router.h:51
Screen::url
QString url
Definition
router.h:57
Screen::Screen
Screen()
Empty screen.
Definition
router.cpp:27
projects
app
src
bridge
router.cpp
Generated by
1.17.0