Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/frontend/StarCodexInterface.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/frontend/StarCodexInterface.cpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/frontend/StarCodexInterface.cpp')
-rw-r--r--source/frontend/StarCodexInterface.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/source/frontend/StarCodexInterface.cpp b/source/frontend/StarCodexInterface.cpp
new file mode 100644
index 0000000..f841c5d
--- /dev/null
+++ b/source/frontend/StarCodexInterface.cpp
@@ -0,0 +1,159 @@
+#include "StarCodexInterface.hpp"
+#include "StarCodex.hpp"
+#include "StarGuiReader.hpp"
+#include "StarRoot.hpp"
+#include "StarPlayer.hpp"
+#include "StarLabelWidget.hpp"
+#include "StarListWidget.hpp"
+#include "StarStackWidget.hpp"
+#include "StarImageWidget.hpp"
+#include "StarButtonWidget.hpp"
+#include "StarButtonGroup.hpp"
+#include "StarAssets.hpp"
+
+namespace Star {
+
+CodexInterface::CodexInterface(PlayerPtr player) {
+ m_player = player;
+
+ auto assets = Root::singleton().assets();
+
+ GuiReader reader;
+
+ reader.registerCallback("close", [=](Widget*) { dismiss(); });
+ reader.registerCallback("prevButton", [=](Widget*) { backwardPage(); });
+ reader.registerCallback("nextButton", [=](Widget*) { forwardPage(); });
+ reader.registerCallback("selectCodex", [=](Widget*) { showSelectedContents(); });
+ reader.registerCallback("updateSpecies", [=](Widget*) { updateSpecies(); });
+
+ reader.construct(assets->json("/interface/windowconfig/codex.config:paneLayout"), this);
+
+ m_speciesTabs = fetchChild<ButtonGroupWidget>("speciesTabs");
+ m_selectLabel = fetchChild<LabelWidget>("selectLabel");
+ m_titleLabel = fetchChild<LabelWidget>("titleLabel");
+ m_bookList = fetchChild<ListWidget>("scrollArea.bookList");
+ m_pageContent = fetchChild<LabelWidget>("pageText");
+ m_pageLabelWidget = fetchChild<LabelWidget>("pageLabel");
+ m_pageNumberWidget = fetchChild<LabelWidget>("pageNum");
+ m_prevPageButton = fetchChild<ButtonWidget>("prevButton");
+ m_nextPageButton = fetchChild<ButtonWidget>("nextButton");
+
+ m_selectText = assets->json("/interface/windowconfig/codex.config:selectText").toString();
+
+ m_currentPage = 0;
+ updateSpecies();
+ setupPageText();
+}
+
+void CodexInterface::show() {
+ Pane::show();
+ updateCodexList();
+}
+
+void CodexInterface::tick() {
+ updateCodexList();
+}
+
+void CodexInterface::showSelectedContents() {
+ if (m_bookList->selectedItem() == NPos || m_bookList->selectedItem() >= m_codexList.size())
+ return;
+
+ showContents(m_codexList[m_bookList->selectedItem()].first);
+}
+
+void CodexInterface::showContents(String const& codexId) {
+ CodexConstPtr result;
+ for (auto entry : m_codexList)
+ if (entry.first->id() == codexId) {
+ result = entry.first;
+ break;
+ }
+ if (result)
+ showContents(result);
+}
+
+void CodexInterface::showContents(CodexConstPtr codex) {
+ if (m_player->codexes()->markCodexRead(codex->id()))
+ updateCodexList();
+ m_currentCodex = codex;
+ m_currentPage = 0;
+ setupPageText();
+}
+
+void CodexInterface::forwardPage() {
+ if (m_currentCodex && m_currentPage < m_currentCodex->pageCount() - 1) {
+ ++m_currentPage;
+ setupPageText();
+ }
+}
+
+void CodexInterface::backwardPage() {
+ if (m_currentCodex && m_currentPage > 0) {
+ --m_currentPage;
+ setupPageText();
+ }
+}
+
+bool CodexInterface::showNewCodex() {
+ if (auto newCodex = m_player->codexes()->firstNewCodex()) {
+ for (auto button : m_speciesTabs->buttons()) {
+ if (button->data().getString("species") == newCodex->species()) {
+ m_speciesTabs->select(m_speciesTabs->id(button));
+ break;
+ }
+ }
+ showContents(newCodex);
+ return true;
+ }
+
+ return false;
+}
+
+void CodexInterface::updateSpecies() {
+ String newSpecies = "other";
+ if (auto speciesButton = m_speciesTabs->checkedButton())
+ newSpecies = speciesButton->data().getString("species");
+ if (newSpecies != m_currentSpecies) {
+ m_currentCodex = {};
+ m_currentSpecies = newSpecies;
+ m_bookList->clearSelected();
+ setupPageText();
+ }
+ m_selectLabel->setText(m_selectText.replaceTags(StringMap<String>{{"species", m_currentSpecies}}).titleCase());
+}
+
+void CodexInterface::setupPageText() {
+ if (m_currentCodex) {
+ m_pageContent->setText(m_currentCodex->page(m_currentPage));
+ m_pageLabelWidget->show();
+ m_pageNumberWidget->setText(strf("%d of %d", m_currentPage + 1, m_currentCodex->pageCount()));
+ m_titleLabel->setText(m_currentCodex->title());
+ m_nextPageButton->setEnabled(m_currentPage < m_currentCodex->pageCount() - 1);
+ m_prevPageButton->setEnabled(m_currentPage > 0);
+ } else {
+ m_pageContent->setText("");
+ m_pageLabelWidget->hide();
+ m_pageNumberWidget->setText("");
+ m_titleLabel->setText("");
+ m_nextPageButton->disable();
+ m_prevPageButton->disable();
+ }
+}
+
+void CodexInterface::updateCodexList() {
+ auto newCodexList = m_player->codexes()->codexes();
+ filter(newCodexList, [&](auto const& p) {
+ return p.first->species() == m_currentSpecies;
+ });
+ if (m_codexList != newCodexList) {
+ m_bookList->removeAllChildren();
+ m_codexList = newCodexList;
+ for (auto entry : m_codexList) {
+ auto newEntry = m_bookList->addItem();
+ newEntry->fetchChild<LabelWidget>("bookName")->setText(entry.first->title());
+ newEntry->fetchChild<ImageWidget>("bookIcon")->setImage(entry.first->icon());
+ }
+ }
+}
+
+}