From 2185d2858af8de056737637a6ffd247da5e20be2 Mon Sep 17 00:00:00 2001 From: my name Date: Thu, 20 Aug 2026 00:51:53 +0200 Subject: [PATCH] App now uses separate add_session to insert data into it improved the hub and spoke-ish model of App by making it more clear that its components have specific responsibilities, which App then glues together. moved timermanager to App to seperate the invoker from receiver so we can eventually add interactivity also fixed the using namespace std error from a while ago --- src/core/app.cpp | 52 ++++++++++++++++++++++++++++++------------------ src/core/app.hpp | 11 ++++++---- src/sessions.hpp | 17 +++------------- src/sorters.hpp | 16 +++++++-------- src/sortui.cpp | 14 ++++--------- 5 files changed, 54 insertions(+), 56 deletions(-) diff --git a/src/core/app.cpp b/src/core/app.cpp index 4157bf7..78a1545 100644 --- a/src/core/app.cpp +++ b/src/core/app.cpp @@ -5,10 +5,12 @@ #include "./app.hpp" +using namespace std; + bool displaySortInput(shared_ptr input) { cout << "name: " + input->name + " values: "; for (size_t i = 0; i < input->values.size(); ++i) { - printf("%d | ",input->values[i]); + printf("%d | ", input->values[i]); } printf("\n"); return false; @@ -18,37 +20,49 @@ string arraytostr(shared_ptr input) { string myoutput; ostringstream stringrep; for (size_t i = 0; i < input->values.size(); ++i) { - stringrep << input->values[i] <<" | "; -} + stringrep << input->values[i] << " | "; + } return stringrep.str(); } -App::App(vector> inputs, unique_ptr mysortsession, unique_ptr myviewsession) - : inputs(std::move(inputs)) - , mysortsession(std::move(mysortsession)) - , myviewsession(std::move(myviewsession)) -{ +App::App(unique_ptr myviewsession) + : viewsession(std::move(myviewsession)) {} + +//connects data with logic and invoker +void App::setup_session(shared_ptr myinput, string sorttype) { + cout << "adding sort " << sorttype << "\n"; + //push data to app + inputs.push_back(myinput); + //connect data to logic + if (sorttype == "bsort") { + sortsession.add_session(myinput, sorttype); + } + //connect logic to timer (should not be hardcoded to timers) + auto prs = sortsession.sortsessions.back().get(); + timermanager.add_timer( + 0, [prs]() { return prs->step(); }, std::chrono::milliseconds(250)); } -void App::run(){ - //set up ui - while (myviewsession->mywindow.isOpen()){ - while (const optional event = myviewsession->mywindow.pollEvent()){ +void App::run() { + // set up ui + while (viewsession->mywindow.isOpen()) { + while (const optional event = viewsession->mywindow.pollEvent()) { if (event->is()) - myviewsession->mywindow.close(); + viewsession->mywindow.close(); } - myviewsession->mywindow.clear(sf::Color::Black); - myviewsession->mywindow.draw(myviewsession->text); - myviewsession->text.setString(arraytostr(inputs[0])); - - mysortsession->update_sorts(); + //draw + viewsession->mywindow.clear(sf::Color::Black); + viewsession->mywindow.draw(viewsession->text); + viewsession->text.setString(arraytostr(inputs[0])); for (shared_ptr input : inputs) { displaySortInput(input); } + viewsession->mywindow.display(); - myviewsession->mywindow.display(); + //update logic + timermanager.update_timers(); this_thread::sleep_for(std::chrono::milliseconds(250)); } } diff --git a/src/core/app.hpp b/src/core/app.hpp index 6bb9f57..7bc2d5f 100644 --- a/src/core/app.hpp +++ b/src/core/app.hpp @@ -7,18 +7,21 @@ #include #include +#include "../timer.hpp" #include "../sorters.hpp" #include "../sessions.hpp" //should connect the different parts //for now data, mutation, and rendering struct App{ - vector> inputs; - unique_ptr mysortsession; - unique_ptr myviewsession; + std::vector> inputs; + SortSession sortsession; + std::unique_ptr viewsession; + TimerManager timermanager; - App(vector> inputs, unique_ptr mysortsession, unique_ptr myviewsession); + App(std::unique_ptr myviewsession); + void setup_session(std::shared_ptr myinput, std::string sorttype); void run(); }; diff --git a/src/sessions.hpp b/src/sessions.hpp index d0b50eb..436bf90 100644 --- a/src/sessions.hpp +++ b/src/sessions.hpp @@ -7,30 +7,19 @@ #include #include "sorters.hpp" -#include "timer.hpp" - //owns and manages the sorters that mutate data, but does not own the data itself -//steppables/sorts are currently updated by timermanager(should be decoupled) struct SortSession { - vector> sortsessions; - TimerManager SortTimer; + std::vector> sortsessions; SortSession(){ } //connects data with a sorter and controls it through a timer - void add_session(shared_ptr input, string sorttype){ + void add_session(std::shared_ptr input, std::string sorttype){ if(sorttype == "bsort"){ sortsessions.push_back(make_unique(input)); - } - auto prs = sortsessions.back().get(); - SortTimer.add_timer(0, - [prs]() {return prs->step();}, - std::chrono::milliseconds(250)); - } - void update_sorts(){ - SortTimer.update_timers(); + }; } }; diff --git a/src/sorters.hpp b/src/sorters.hpp index 2ac9ed9..a5b5ebd 100644 --- a/src/sorters.hpp +++ b/src/sorters.hpp @@ -8,36 +8,34 @@ #include "steppable.hpp" -using namespace std; - //ground truth domain data struct SortInput { - string name; - vector values; + std::string name; + std::vector values; - SortInput(string name, vector data) + SortInput(std::string name, std::vector data) : name(name), values(data) {} }; //ro rendering of data struct SortView { - shared_ptr values; + std::shared_ptr values; size_t currenttarget = 0; int x,y; int color; - SortView(shared_ptr in): values(in) {} + SortView(std::shared_ptr in): values(in) {} }; //mutates the domain data class SteppedBsort: public Steppable { public: - shared_ptr data; + std::shared_ptr data; size_t stepcount = 0; size_t i = 0; size_t j = 0; bool is_finished = false; - SteppedBsort(shared_ptr data); + SteppedBsort(std::shared_ptr data); bool step(); }; diff --git a/src/sortui.cpp b/src/sortui.cpp index 17568da..d6f414f 100644 --- a/src/sortui.cpp +++ b/src/sortui.cpp @@ -18,27 +18,21 @@ using namespace std::chrono; using namespace std; - vector dataprovider(){ return vector {9,8,1,2,7,3,6,4,5}; } int main() { //create data - vector> inputs; auto myinput = make_shared("arr1", dataprovider()); auto myinput2 = make_shared("arr2", dataprovider()); - inputs.push_back(myinput); - inputs.push_back(myinput2); - - //connect data with sorter - auto myssession = make_unique(); - myssession->add_session(myinput, "bsort"); - auto myviewsession = make_unique(); //create app with initialized dependencies - App myapp(std::move(inputs), std::move(myssession), std::move(myviewsession)); + App myapp(std::move(myviewsession)); + //add and connect data + myapp.setup_session(myinput, "bsort"); + //actually start the app myapp.run(); }