Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
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
28Screen::Screen(bool modal, QString title, QString url, bool homeBtn)
29 : modal(modal),
30 title(title),
31 url(url),
33{}
34
35void 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
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
114void 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
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
167QHash<QString, Screen*> Router::screens = QHash<QString, Screen*>();
168QVector<Screen*> Router::stack = QVector<Screen*>();
static void loadScreens()
Register the app's screen set (called at boot).
Definition router.cpp:139
void manualStackPush(QString name)
StackView-internal: push name without side effects.
Definition router.cpp:114
void changeScreen(QString name)
Navigate to the registered screen name.
Definition router.cpp:35
static QVector< Screen * > stack
The live navigation stack.
Definition router.h:103
void closeScreen()
Close the top screen.
Definition router.cpp:78
static QHash< QString, Screen * > screens
The registry of named screens.
Definition router.h:104
QString title
Definition router.h:98
bool homeBtnShown
Definition router.h:99
One registered screen: its QML url, title, and modal/home-button flags.
Definition router.h:32
bool homeBtn
Definition router.h:59
QString title
Definition router.h:54
bool modal
Definition router.h:51
QString url
Definition router.h:57
Screen()
Empty screen.
Definition router.cpp:27