Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Passing boost::optional ProgressBar handle (from inside DynamicProgress) to function for mutation #112

Open
tmcg0 opened this issue May 25, 2022 · 0 comments

Comments

@tmcg0
Copy link

tmcg0 commented May 25, 2022

Loving this repo so far, thanks for all your hard work. Any advice would be greatly appreciated. I've got a possible enhancement, but want to make sure I'm not missing anything on how I could do this via a workaround.

In short, I'd like to have worker functions which can modify an optionally (via boost::optional) passed-in ProgressBar, which is inside a DynamicProgress in the application-level code.

Say I have a a ProgressBars that I then pass into DynamicProgress dbar, like so:

indicators::ProgressBar bar1{
      indicators::option::BarWidth{40},
      indicators::option::PrefixText{"progress bar 1"},
      indicators::option::PostfixText{"not mutated by function yet"}
};
indicators::ProgressBar bar2{
      indicators::option::BarWidth{40},
      indicators::option::PrefixText{"progress bar 2"},
      indicators::option::PostfixText{"not mutated by function yet"}
  };
indicators::DynamicProgress<indicators::ProgressBar> dbar;
dbar.push_back(bar1);
dbar.push_back(bar2);

I would then like to be able to pass the ProgressBar at dbar[0] to a function which mutates it, e.g. changes the progress or text, without having to pass the parent DynamicProgress. Being forced to pass the parent DynamicProgress is messy: it means that worker functions can't be passed individual progress bars without unnecessary code (e.g. having to first put the single progressbar in a dynamicprogress at the application level), and forces a clunky interface to the worker function because you also have to pass in the index of the bar inside the DynamicProgress.

Minimum (not) working example of what I'd like to do:

#include <indicators/progress_bar.hpp>
#include <indicators/dynamic_progress.hpp>
#include <boost/optional.hpp>

void pbar_mutation_function(boost::optional<indicators::ProgressBar*> bar=boost::none);

int main() {
    // build progressbars
    indicators::ProgressBar bar1{
        indicators::option::BarWidth{40},
        indicators::option::PrefixText{"progress bar 1"},
        indicators::option::PostfixText{"not mutated by function yet"}
    };
    indicators::ProgressBar bar2{
        indicators::option::BarWidth{40},
        indicators::option::PrefixText{"progress bar 2"},
        indicators::option::PostfixText{"not mutated by function yet"}
    };
    // insert it into a dynamic progress container
    indicators::DynamicProgress<indicators::ProgressBar> dbar;
    dbar.push_back(bar1);
    dbar.push_back(bar2);
    // pass the child progressbar "bar1" into mutation function
    pbar_mutation_function(&(dbar[0])); // this doesn't work :(
    return 0;
}

void pbar_mutation_function(boost::optional<indicators::ProgressBar*> bar){
    // update bar postfix text to notify you're in the mutation function
    if(bar){
      (*(*bar)).set_option(indicators::option::PostfixText{"inside bar mutation function"});
    }
    // in loop iterate up bar
    for(uint i=0; i<=100; i++){
      if(bar){
        (*(*bar)).set_option(indicators::option::PostfixText{"inside bar mutation function: i="+std::to_string(i)});
        (*(*bar)).tick();
      }
      std::this_thread::sleep_for(std::chrono::milliseconds(5));
    }
    // mark bar as complete
    if(bar){
      (*(*bar)).mark_as_completed();
    }
}

Desired behavior of above example
Two progress bars are initialized on the console, but only bar1 gets iterated up.

Observed behavior
Neither bar gets modified.
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant