From 05024cc7870606ea9a2ca3840811a665748d52fb Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Sun, 5 Aug 2012 13:08:51 +0100 Subject: [PATCH] Persistent search window responds to user auth events --- src/search/SearchController.cpp | 3 +- src/search/SearchView.cpp | 102 ++++++++++++++++++++++---------- src/search/SearchView.h | 5 +- 3 files changed, 78 insertions(+), 32 deletions(-) diff --git a/src/search/SearchController.cpp b/src/search/SearchController.cpp index cd1e5f07c..d7d422c63 100644 --- a/src/search/SearchController.cpp +++ b/src/search/SearchController.cpp @@ -34,7 +34,8 @@ SearchController::SearchController(ControllerCallback * callback): activePreview(NULL), HasExited(false), nextQueryTime(0.0f), - nextQueryDone(true) + nextQueryDone(true), + searchModel(NULL) { searchModel = new SearchModel(); searchView = new SearchView(); diff --git a/src/search/SearchView.cpp b/src/search/SearchView.cpp index 1e55ed584..ddbf49a8e 100644 --- a/src/search/SearchView.cpp +++ b/src/search/SearchView.cpp @@ -10,9 +10,12 @@ SearchView::SearchView(): ui::Window(ui::Point(0, 0), ui::Point(XRES+BARSIZE, YRES+MENUSIZE)), saveButtons(vector()), - errorLabel(NULL) + errorLabel(NULL), + c(NULL) { + Client::Ref().AddListener(this); + nextButton = new ui::Button(ui::Point(XRES+BARSIZE-52, YRES+MENUSIZE-18), ui::Point(50, 16), "Next \x95"); previousButton = new ui::Button(ui::Point(1, YRES+MENUSIZE-18), ui::Point(50, 16), "\x96 Prev"); infoLabel = new ui::Label(ui::Point(51, YRES+MENUSIZE-18), ui::Point(XRES+BARSIZE-102, 16), "Loading..."); @@ -29,7 +32,8 @@ SearchView::SearchView(): } }; searchField = new ui::Textbox(ui::Point(60, 10), ui::Point((XRES+BARSIZE)-226, 16), ""); - searchField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; searchField->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; + searchField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; + searchField->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; searchField->SetActionCallback(new SearchAction(this)); class SortAction : public ui::ButtonAction @@ -44,7 +48,8 @@ SearchView::SearchView(): }; sortButton = new ui::Button(ui::Point(XRES+BARSIZE-140, 10), ui::Point(60, 16), "Sort"); sortButton->SetActionCallback(new SortAction(this)); - sortButton->Appearance.HorizontalAlign = ui::Appearance::AlignCentre; sortButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; + sortButton->Appearance.HorizontalAlign = ui::Appearance::AlignCentre; + sortButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(sortButton); class MyOwnAction : public ui::ButtonAction @@ -60,9 +65,8 @@ SearchView::SearchView(): ownButton = new ui::Button(ui::Point(XRES+BARSIZE-70, 10), ui::Point(60, 16), "My Own"); ownButton->SetTogglable(true); ownButton->SetActionCallback(new MyOwnAction(this)); - if(!Client::Ref().GetAuthUser().ID) - ownButton->Enabled = false; - ownButton->Appearance.HorizontalAlign = ui::Appearance::AlignCentre; ownButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; + ownButton->Appearance.HorizontalAlign = ui::Appearance::AlignCentre; + ownButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(ownButton); class FavAction : public ui::ButtonAction @@ -79,9 +83,8 @@ SearchView::SearchView(): favButton->SetIcon(IconFavourite); favButton->SetTogglable(true); favButton->SetActionCallback(new FavAction(this)); - if(!Client::Ref().GetAuthUser().ID) - favButton->Enabled = false; - favButton->Appearance.HorizontalAlign = ui::Appearance::AlignCentre; favButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; + favButton->Appearance.HorizontalAlign = ui::Appearance::AlignCentre; + favButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(favButton); class NextPageAction : public ui::ButtonAction @@ -95,7 +98,8 @@ SearchView::SearchView(): } }; nextButton->SetActionCallback(new NextPageAction(this)); - nextButton->Appearance.HorizontalAlign = ui::Appearance::AlignRight; nextButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; + nextButton->Appearance.HorizontalAlign = ui::Appearance::AlignRight; + nextButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; class PrevPageAction : public ui::ButtonAction { SearchView * v; @@ -107,7 +111,8 @@ SearchView::SearchView(): } }; previousButton->SetActionCallback(new PrevPageAction(this)); - previousButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; previousButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; + previousButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; + previousButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(nextButton); AddComponent(previousButton); AddComponent(searchField); @@ -117,7 +122,8 @@ SearchView::SearchView(): AddComponent(loadingSpinner); ui::Label * searchPrompt = new ui::Label(ui::Point(10, 10), ui::Point(50, 16), "Search:"); - searchPrompt->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; searchPrompt->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; + searchPrompt->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; + searchPrompt->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(searchPrompt); class RemoveSelectedAction : public ui::ButtonAction @@ -184,24 +190,7 @@ SearchView::SearchView(): clearSelection->SetActionCallback(new ClearSelectionAction(this)); AddComponent(clearSelection); - if(Client::Ref().GetAuthUser().ID) - { - favouriteSelected->Enabled = true; - if((Client::Ref().GetAuthUser().UserElevation == ElevationAdmin || Client::Ref().GetAuthUser().UserElevation == ElevationModerator)) - { - unpublishSelected->Enabled = true; - removeSelected->Enabled = true; - } - else - { - unpublishSelected->Enabled = false; - removeSelected->Enabled = false; - } - } - else - { - favouriteSelected->Enabled = true; - } + CheckAccess(); } void SearchView::doSearch() @@ -211,6 +200,7 @@ void SearchView::doSearch() SearchView::~SearchView() { + Client::Ref().RemoveListener(this); RemoveComponent(nextButton); RemoveComponent(previousButton); RemoveComponent(infoLabel); @@ -294,6 +284,58 @@ void SearchView::NotifyPageChanged(SearchModel * sender) } } +void SearchView::NotifyAuthUserChanged(Client * sender) +{ + CheckAccess(); +} + +void SearchView::CheckAccess() +{ + if(c) + { + c->ClearSelection(); + + if(ownButton->GetToggleState()) + ownButton->DoAction(); + if(favButton->GetToggleState()) + favButton->DoAction(); + } + + if(Client::Ref().GetAuthUser().ID) + { + ownButton->Enabled = true; + favButton->Enabled = true; + favouriteSelected->Enabled = true; + + if(Client::Ref().GetAuthUser().UserElevation == ElevationAdmin || Client::Ref().GetAuthUser().UserElevation == ElevationModerator) + { + unpublishSelected->Enabled = true; + removeSelected->Enabled = true; + for(int i = 0; i < saveButtons.size(); i++) + { + saveButtons[i]->SetSelectable(true); + } + } + + } + else + { + ownButton->Enabled = false; + favButton->Enabled = false; + + + favouriteSelected->Enabled = false; + unpublishSelected->Enabled = false; + removeSelected->Enabled = false; + + for(int i = 0; i < saveButtons.size(); i++) + { + saveButtons[i]->SetSelectable(false); + saveButtons[i]->SetSelected(false); + } + } +} + void SearchView::NotifySaveListChanged(SearchModel * sender) { int i = 0; diff --git a/src/search/SearchView.h b/src/search/SearchView.h index abded8591..eb7dade93 100644 --- a/src/search/SearchView.h +++ b/src/search/SearchView.h @@ -8,13 +8,14 @@ #include "interface/Label.h" #include "interface/Spinner.h" #include "interface/Textbox.h" +#include "client/ClientListener.h" using namespace std; class SearchModel; class SearchController; -class SearchView: public ui::Window +class SearchView: public ui::Window, public ClientListener { private: SearchController * c; @@ -43,6 +44,8 @@ public: void NotifySortChanged(SearchModel * sender); void NotifyShowOwnChanged(SearchModel * sender); void NotifyShowFavouriteChanged(SearchModel * sender); + void NotifyAuthUserChanged(Client * sender); + void CheckAccess(); SearchView(); virtual ~SearchView(); void AttachController(SearchController * _c) { c = _c; }