diff --git a/src/PowderToy.cpp b/src/PowderToy.cpp index a13a817ff..2918a0594 100644 --- a/src/PowderToy.cpp +++ b/src/PowderToy.cpp @@ -67,7 +67,7 @@ int main(int argc, char * argv[]) ui::Engine::Ref().g->AttachSDLSurface(SDLOpen()); ui::Engine * engine = &ui::Engine::Ref(); - engine->Begin(XRES, YRES); + engine->Begin(XRES+BARSIZE, YRES+MENUSIZE); GameController * gameController = new GameController(); engine->ShowWindow(gameController->GetView()); diff --git a/src/interface/Engine.cpp b/src/interface/Engine.cpp index 6f81f5648..85a62932f 100644 --- a/src/interface/Engine.cpp +++ b/src/interface/Engine.cpp @@ -19,7 +19,9 @@ Engine::Engine(): mousexp_(0), mouseyp_(0), FpsLimit(60.0f), - windows(stack()) + windows(stack()), + lastBuffer(NULL), + prevBuffers(stack()) { } @@ -51,17 +53,44 @@ void Engine::Exit() void Engine::ShowWindow(Window * window) { + if(window->Position.X==-1) + { + window->Position.X = (width_-window->Size.X)/2; + } + if(window->Position.Y==-1) + { + window->Position.Y = (height_-window->Size.Y)/2; + } if(state_) { + if(lastBuffer) + { + prevBuffers.push(lastBuffer); + } + lastBuffer = (pixel*)malloc((width_ * height_) * PIXELSIZE); + g->fillrect(0, 0, width_, height_, 0, 0, 0, 100); + memcpy(lastBuffer, g->vid, (width_ * height_) * PIXELSIZE); + windows.push(state_); } state_ = window; + } void Engine::CloseWindow() { if(!windows.empty()) { + if(!prevBuffers.empty()) + { + lastBuffer = prevBuffers.top(); + prevBuffers.pop(); + } + else + { + free(lastBuffer); + lastBuffer = NULL; + } state_ = windows.top(); windows.pop(); } @@ -112,10 +141,17 @@ void Engine::Tick(float dt) void Engine::Draw() { + if(lastBuffer && !(state_->Position.X == 0 && state_->Position.Y == 0 && state_->Size.X == width_ && state_->Size.Y == height_)) + { + memcpy(g->vid, lastBuffer, (width_ * height_) * PIXELSIZE); + } + else + { + g->Clear(); + } if(state_) state_->DoDraw(); g->Blit(); - g->Clear(); } void Engine::onKeyPress(int key, bool shift, bool ctrl, bool alt) diff --git a/src/interface/Engine.h b/src/interface/Engine.h index 7bf78f9d6..a6481194e 100644 --- a/src/interface/Engine.h +++ b/src/interface/Engine.h @@ -54,6 +54,8 @@ namespace ui float FpsLimit; Graphics * g; private: + pixel * lastBuffer; + std::stack prevBuffers; std::stack windows; //Window* statequeued_; Window* state_; diff --git a/src/interface/SaveButton.h b/src/interface/SaveButton.h index 8019a3c8e..65cff52ed 100644 --- a/src/interface/SaveButton.h +++ b/src/interface/SaveButton.h @@ -39,6 +39,7 @@ public: virtual void Draw(const Point& screenPos); virtual void Tick(float dt); + Save * GetSave() { return save; } inline bool GetState() { return state; } virtual void DoAction(); void SetActionCallback(SaveButtonAction * action); diff --git a/src/interface/Window.h b/src/interface/Window.h index 581b91f4c..4fc2b14fe 100644 --- a/src/interface/Window.h +++ b/src/interface/Window.h @@ -23,6 +23,9 @@ enum ChromeStyle class Window { public: + Point Position; + Point Size; + Window(Point _position, Point _size); virtual ~Window(); @@ -74,9 +77,6 @@ enum ChromeStyle virtual void OnKeyRelease(int key, bool shift, bool ctrl, bool alt) {} std::vector Components; Component* focusedComponent_; - - Point Position; - Point Size; ChromeStyle chrome; }; diff --git a/src/preview/PreviewController.cpp b/src/preview/PreviewController.cpp new file mode 100644 index 000000000..04c4dd63a --- /dev/null +++ b/src/preview/PreviewController.cpp @@ -0,0 +1,26 @@ +/* + * PreviewController.cpp + * + * Created on: Jan 21, 2012 + * Author: Simon + */ + +#include "PreviewController.h" +#include "PreviewView.h" +#include "PreviewModel.h" + +PreviewController::PreviewController(int saveID) { + // TODO Auto-generated constructor stub + previewModel = new PreviewModel(); + previewView = new PreviewView(); + previewModel->AddObserver(previewView); + previewView->AttachController(this); + + previewModel->UpdateSave(saveID); +} + +PreviewController::~PreviewController() { + delete previewView; + delete previewModel; +} + diff --git a/src/preview/PreviewController.h b/src/preview/PreviewController.h new file mode 100644 index 000000000..373ff03b8 --- /dev/null +++ b/src/preview/PreviewController.h @@ -0,0 +1,25 @@ +/* + * PreviewController.h + * + * Created on: Jan 21, 2012 + * Author: Simon + */ + +#ifndef PREVIEWCONTROLLER_H_ +#define PREVIEWCONTROLLER_H_ + +#include "preview/PreviewModel.h" +#include "preview/PreviewView.h" + +class PreviewModel; +class PreviewView; +class PreviewController { + PreviewModel * previewModel; + PreviewView * previewView; +public: + PreviewController(int saveID); + PreviewView * GetView() { return previewView; } + virtual ~PreviewController(); +}; + +#endif /* PREVIEWCONTROLLER_H_ */ diff --git a/src/preview/PreviewModel.cpp b/src/preview/PreviewModel.cpp new file mode 100644 index 000000000..bf51ff0b2 --- /dev/null +++ b/src/preview/PreviewModel.cpp @@ -0,0 +1,29 @@ +/* + * PreviewModel.cpp + * + * Created on: Jan 21, 2012 + * Author: Simon + */ + +#include "PreviewModel.h" + +PreviewModel::PreviewModel(): + save(NULL) +{ + // TODO Auto-generated constructor stub + +} + +void PreviewModel::UpdateSave(int saveID) +{ + +} + +void PreviewModel::AddObserver(PreviewView * observer) { + observers.push_back(observer); +} + +PreviewModel::~PreviewModel() { + // TODO Auto-generated destructor stub +} + diff --git a/src/preview/PreviewModel.h b/src/preview/PreviewModel.h new file mode 100644 index 000000000..ba1139066 --- /dev/null +++ b/src/preview/PreviewModel.h @@ -0,0 +1,28 @@ +/* + * PreviewModel.h + * + * Created on: Jan 21, 2012 + * Author: Simon + */ + +#ifndef PREVIEWMODEL_H_ +#define PREVIEWMODEL_H_ + +#include +#include "PreviewView.h" +#include "search/Save.h" + +using namespace std; + +class PreviewView; +class PreviewModel { + vector observers; + Save * save; +public: + PreviewModel(); + void AddObserver(PreviewView * observer); + void UpdateSave(int saveID); + virtual ~PreviewModel(); +}; + +#endif /* PREVIEWMODEL_H_ */ diff --git a/src/preview/PreviewView.cpp b/src/preview/PreviewView.cpp new file mode 100644 index 000000000..886dd674c --- /dev/null +++ b/src/preview/PreviewView.cpp @@ -0,0 +1,29 @@ +/* + * PreviewView.cpp + * + * Created on: Jan 21, 2012 + * Author: Simon + */ + +#include "PreviewView.h" +#include "interface/Point.h" +#include "interface/Window.h" + +PreviewView::PreviewView(): + ui::Window(ui::Point(-1, -1), ui::Point(200, 200)) +{ + // TODO Auto-generated constructor stub + +} + +void PreviewView::OnDraw() +{ + Graphics * g = ui::Engine::Ref().g; + g->clearrect(Position.X-2, Position.Y-2, Size.X+4, Size.Y+4); + g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255); +} + +PreviewView::~PreviewView() { + // TODO Auto-generated destructor stub +} + diff --git a/src/preview/PreviewView.h b/src/preview/PreviewView.h new file mode 100644 index 000000000..728d5472d --- /dev/null +++ b/src/preview/PreviewView.h @@ -0,0 +1,23 @@ +/* + * PreviewView.h + * + * Created on: Jan 21, 2012 + * Author: Simon + */ + +#ifndef PREVIEWVIEW_H_ +#define PREVIEWVIEW_H_ +#include "interface/Window.h" +#include "preview/PreviewController.h" + +class PreviewController; +class PreviewView: public ui::Window { + PreviewController * c; +public: + void AttachController(PreviewController * controller) { c = controller;} + PreviewView(); + virtual void OnDraw(); + virtual ~PreviewView(); +}; + +#endif /* PREVIEWVIEW_H_ */ diff --git a/src/search/SearchController.cpp b/src/search/SearchController.cpp index 710359107..46a353cab 100644 --- a/src/search/SearchController.cpp +++ b/src/search/SearchController.cpp @@ -3,8 +3,10 @@ #include "SearchModel.h" #include "SearchView.h" #include "interface/Panel.h" +#include "preview/PreviewController.h" -SearchController::SearchController() +SearchController::SearchController(): + activePreview(NULL) { searchModel = new SearchModel(); searchView = new SearchView(); @@ -19,6 +21,11 @@ SearchController::SearchController() SearchController::~SearchController() { + if(activePreview) + { + ui::Engine::Ref().CloseWindow(); + delete activePreview; + } delete searchModel; delete searchView; } @@ -54,5 +61,11 @@ void SearchController::ChangeSort() void SearchController::ShowOwn(bool show) { - + //TODO: Implement +} + +void SearchController::OpenSave(int saveID) +{ + activePreview = new PreviewController(saveID); + ui::Engine::Ref().ShowWindow(activePreview->GetView()); } diff --git a/src/search/SearchController.h b/src/search/SearchController.h index c9fdb21ee..d67743e5f 100644 --- a/src/search/SearchController.h +++ b/src/search/SearchController.h @@ -4,6 +4,7 @@ #include "interface/Panel.h" #include "SearchModel.h" #include "SearchView.h" +#include "preview/PreviewController.h" class SearchView; class SearchModel; class SearchController @@ -11,6 +12,7 @@ class SearchController private: SearchModel * searchModel; SearchView * searchView; + PreviewController * activePreview; public: SearchController(); ~SearchController(); @@ -20,6 +22,7 @@ public: void PrevPage(); void ChangeSort(); void ShowOwn(bool show); + void OpenSave(int saveID); }; #endif // SEARCHCONTROLLER_H diff --git a/src/search/SearchView.cpp b/src/search/SearchView.cpp index 57e5558d3..e589d2013 100644 --- a/src/search/SearchView.cpp +++ b/src/search/SearchView.cpp @@ -178,6 +178,16 @@ void SearchView::NotifySaveListChanged(SearchModel * sender) buttonAreaHeight = Size.Y - buttonYOffset - 18; buttonWidth = (buttonAreaWidth/savesX) - buttonPadding*2; buttonHeight = (buttonAreaHeight/savesY) - buttonPadding*2; + class SaveOpenAction: public ui::SaveButtonAction + { + SearchView * v; + public: + SaveOpenAction(SearchView * _v) { v = _v; } + virtual void ActionCallback(ui::SaveButton * sender) + { + v->c->OpenSave(sender->GetSave()->GetID()); + } + }; for(i = 0; i < saves.size(); i++) { if(saveX == savesX) @@ -195,6 +205,7 @@ void SearchView::NotifySaveListChanged(SearchModel * sender) ), ui::Point(buttonWidth, buttonHeight), saves[i]); + saveButton->SetActionCallback(new SaveOpenAction(this)); saveButtons.push_back(saveButton); AddComponent(saveButton); saveX++;