diff --git a/src/gui/game/GameModel.cpp b/src/gui/game/GameModel.cpp index d13ff56e56..7d1b9c6378 100644 --- a/src/gui/game/GameModel.cpp +++ b/src/gui/game/GameModel.cpp @@ -12,6 +12,7 @@ #include "BitmapBrush.h" #include "client/Client.h" #include "client/GameSave.h" +#include "client/SaveFile.h" #include "gui/game/DecorationTool.h" #include "QuickOptions.h" #include "GameModelException.h" diff --git a/src/gui/game/GameView.cpp b/src/gui/game/GameView.cpp index ec42b71b58..078966e446 100644 --- a/src/gui/game/GameView.cpp +++ b/src/gui/game/GameView.cpp @@ -14,6 +14,7 @@ #include "simulation/SaveRenderer.h" #include "simulation/SimulationData.h" #include "gui/dialogues/ConfirmPrompt.h" +#include "client/SaveFile.h" #include "Format.h" #include "QuickOptions.h" #include "IntroText.h" diff --git a/src/gui/search/SearchController.cpp b/src/gui/search/SearchController.cpp index 15bc70f895..16ae3f75f8 100644 --- a/src/gui/search/SearchController.cpp +++ b/src/gui/search/SearchController.cpp @@ -121,16 +121,22 @@ void SearchController::DoSearch(std::string query, bool now) void SearchController::PrevPage() { - if(searchModel->GetPageNum()>1) + if (searchModel->GetPageNum()>1) searchModel->UpdateSaveList(searchModel->GetPageNum()-1, searchModel->GetLastQuery()); } void SearchController::NextPage() { - if(searchModel->GetPageNum() < searchModel->GetPageCount()) + if (searchModel->GetPageNum() < searchModel->GetPageCount()) searchModel->UpdateSaveList(searchModel->GetPageNum()+1, searchModel->GetLastQuery()); } +void SearchController::SetPage(int page) +{ + if (page != searchModel->GetPageNum() && page > 0 && page <= searchModel->GetPageCount()) + searchModel->UpdateSaveList(page, searchModel->GetLastQuery()); +} + void SearchController::ChangeSort() { if(searchModel->GetSort() == "new") diff --git a/src/gui/search/SearchController.h b/src/gui/search/SearchController.h index 40e0b4a129..d8f11286d8 100644 --- a/src/gui/search/SearchController.h +++ b/src/gui/search/SearchController.h @@ -34,6 +34,7 @@ class SearchController void DoSearch(std::string query, bool now = false); void NextPage(); void PrevPage(); + void SetPage(int page); void ChangeSort(); void ShowOwn(bool show); void ShowFavourite(bool show); diff --git a/src/gui/search/SearchModel.h b/src/gui/search/SearchModel.h index 4275a50121..030c37e8c8 100644 --- a/src/gui/search/SearchModel.h +++ b/src/gui/search/SearchModel.h @@ -64,7 +64,7 @@ class SearchModel int GetPageCount() { if (!showOwn && !showFavourite && currentSort == "best" && lastQuery == "") - return max(1, (int)(ceil((resultCount+5)/20.0f))); + return max(1, (int)(ceil((resultCount+5)/20.0f))+1); //add one for front page (front page saves are repeated twice) else return max(1, (int)(ceil(resultCount/20.0f))); } diff --git a/src/gui/search/SearchView.cpp b/src/gui/search/SearchView.cpp index c1a649ed28..c79b2a1eca 100644 --- a/src/gui/search/SearchView.cpp +++ b/src/gui/search/SearchView.cpp @@ -4,26 +4,52 @@ #include "client/Client.h" #include "gui/interface/Keys.h" #include "gui/interface/SaveButton.h" +#include "gui/interface/Button.h" #include "gui/interface/Label.h" #include "gui/interface/RichLabel.h" #include "gui/interface/Textbox.h" +#include "gui/interface/Spinner.h" #include "Misc.h" +#include "Format.h" SearchView::SearchView(): ui::Window(ui::Point(0, 0), ui::Point(WINDOWW, WINDOWH)), saveButtons(vector()), errorLabel(NULL), - c(NULL) + c(NULL), + changed(true), + lastChanged(0), + pageCount(0) { Client::Ref().AddListener(this); nextButton = new ui::Button(ui::Point(WINDOWW-52, WINDOWH-18), ui::Point(50, 16), "Next \x95"); previousButton = new ui::Button(ui::Point(1, WINDOWH-18), ui::Point(50, 16), "\x96 Prev"); - infoLabel = new ui::Label(ui::Point(260, WINDOWH-18), ui::Point(WINDOWW-520, 16), "Page 1 of 1"); tagsLabel = new ui::Label(ui::Point(270, WINDOWH-18), ui::Point(WINDOWW-540, 16), "\boPopular Tags:"); motdLabel = new ui::RichLabel(ui::Point(51, WINDOWH-18), ui::Point(WINDOWW-102, 16), Client::Ref().GetMessageOfTheDay()); + class PageNumAction : public ui::TextboxAction + { + SearchView * v; + public: + PageNumAction(SearchView * _v) { v = _v; } + void TextChangedCallback(ui::Textbox * sender) + { + v->textChanged(); + } + }; + pageTextbox = new ui::Textbox(ui::Point(283, WINDOWH-18), ui::Point(41, 16), ""); + pageTextbox->SetActionCallback(new PageNumAction(this)); + pageTextbox->SetInputType(ui::Textbox::Number); + pageLabel = new ui::Label(ui::Point(0, WINDOWH-18), ui::Point(30, 16), "Page"); //page [TEXTBOX] of y + pageLabel->Appearance.HorizontalAlign = ui::Appearance::AlignRight; + pageCountLabel = new ui::Label(ui::Point(WINDOWW/2+6, WINDOWH-18), ui::Point(50, 16), ""); + pageCountLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; + AddComponent(pageLabel); + AddComponent(pageCountLabel); + AddComponent(pageTextbox); + class SearchAction : public ui::TextboxAction { SearchView * v; @@ -131,6 +157,7 @@ SearchView::SearchView(): nextButton->SetActionCallback(new NextPageAction(this)); nextButton->Appearance.HorizontalAlign = ui::Appearance::AlignRight; nextButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; + nextButton->Visible = false; class PrevPageAction : public ui::ButtonAction { SearchView * v; @@ -144,10 +171,10 @@ SearchView::SearchView(): previousButton->SetActionCallback(new PrevPageAction(this)); previousButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; previousButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; + previousButton->Visible = false; AddComponent(nextButton); AddComponent(previousButton); AddComponent(searchField); - AddComponent(infoLabel); loadingSpinner = new ui::Spinner(ui::Point((WINDOWW/2)-12, (WINDOWH/2)+12), ui::Point(24, 24)); AddComponent(loadingSpinner); @@ -235,13 +262,23 @@ void SearchView::doSearch() c->DoSearch(searchField->GetText()); } - void SearchView::clearSearch() { searchField->SetText(""); c->DoSearch(searchField->GetText(), true); } +void SearchView::textChanged() +{ + int num = format::StringToNumber(pageTextbox->GetText()); + if (num < 0) //0 is allowed so that you can backspace the 1 + pageTextbox->SetText("1"); + else if (num > pageCount) + pageTextbox->SetText(format::NumberToString(pageCount)); + changed = true; + lastChanged = SDL_GetTicks()+600; +} + void SearchView::OnTryOkay(OkayMethod method) { c->DoSearch(searchField->GetText(), true); @@ -252,7 +289,14 @@ SearchView::~SearchView() Client::Ref().RemoveListener(this); RemoveComponent(nextButton); RemoveComponent(previousButton); - RemoveComponent(infoLabel); + RemoveComponent(pageTextbox); + RemoveComponent(pageLabel); + RemoveComponent(pageCountLabel); + delete nextButton; + delete previousButton; + delete pageTextbox; + delete pageLabel; + delete pageCountLabel; for(int i = 0; i < saveButtons.size(); i++) { @@ -260,10 +304,6 @@ SearchView::~SearchView() delete saveButtons[i]; } saveButtons.clear(); - - delete nextButton; - delete previousButton; - delete infoLabel; } void SearchView::Search(std::string query) @@ -330,9 +370,28 @@ void SearchView::NotifyShowFavouriteChanged(SearchModel * sender) void SearchView::NotifyPageChanged(SearchModel * sender) { - std::stringstream pageInfo; - pageInfo << "Page " << sender->GetPageNum() << " of " << sender->GetPageCount(); - infoLabel->SetText(pageInfo.str()); + pageCount = sender->GetPageCount(); + if (!sender->GetSaveList().size()) //no saves + { + pageLabel->Visible = pageCountLabel->Visible = pageTextbox->Visible = false; + } + else + { + std::stringstream pageInfo; + pageInfo << "of " << pageCount; + pageCountLabel->SetText(pageInfo.str()); + int width = Graphics::textwidth(pageInfo.str().c_str()); + + pageLabel->Position.X = WINDOWW/2-width-20; + pageTextbox->Position.X = WINDOWW/2-width+11; + pageTextbox->Size.X = width-4; + //pageCountLabel->Position.X = WINDOWW/2+6; + pageLabel->Visible = pageCountLabel->Visible = pageTextbox->Visible = true; + + pageInfo.str(""); + pageInfo << sender->GetPageNum(); + pageTextbox->SetText(pageInfo.str()); + } if(sender->GetPageNum() == 1) { previousButton->Visible = false; @@ -700,6 +759,11 @@ void SearchView::NotifySelectedChanged(SearchModel * sender) void SearchView::OnTick(float dt) { c->Update(); + if (changed && lastChanged < SDL_GetTicks()) + { + changed = false; + c->SetPage(std::max(format::StringToNumber(pageTextbox->GetText()), 0)); + } } void SearchView::OnMouseWheel(int x, int y, int d) diff --git a/src/gui/search/SearchView.h b/src/gui/search/SearchView.h index 4a684985a1..dfc0559308 100644 --- a/src/gui/search/SearchView.h +++ b/src/gui/search/SearchView.h @@ -3,11 +3,6 @@ #include #include "SearchController.h" -#include "gui/interface/SaveButton.h" -#include "gui/interface/Button.h" -#include "gui/interface/Label.h" -#include "gui/interface/Spinner.h" -#include "gui/interface/Textbox.h" #include "client/ClientListener.h" using namespace std; @@ -36,7 +31,9 @@ class SearchView: public ui::Window, public ClientListener ui::Button * previousButton; ui::Label * errorLabel; ui::Textbox * searchField; - ui::Label * infoLabel; + ui::Textbox * pageTextbox; + ui::Label * pageLabel; + ui::Label * pageCountLabel; ui::Label * tagsLabel; ui::RichLabel * motdLabel; ui::Button * sortButton; @@ -49,6 +46,10 @@ class SearchView: public ui::Window, public ClientListener ui::Button * clearSelection; void clearSearch(); void doSearch(); + void textChanged(); + bool changed; + int lastChanged; + int pageCount; public: void NotifyTagListChanged(SearchModel * sender); void NotifySaveListChanged(SearchModel * sender); diff --git a/src/lua/LuaScriptInterface.cpp b/src/lua/LuaScriptInterface.cpp index f5f923e67f..a8db38af3a 100644 --- a/src/lua/LuaScriptInterface.cpp +++ b/src/lua/LuaScriptInterface.cpp @@ -21,6 +21,7 @@ #include "gui/game/Tool.h" #include "LuaScriptHelper.h" #include "client/HTTP.h" +#include "client/SaveFile.h" #include "Misc.h" #include "PowderToy.h"