/// \file
/// \ingroup tutorial_v7
///
/// \macro_code
///
/// \date 2017-06-02
/// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback
/// is welcome!
/// \author Axel Naumann <axel@cern.ch>

/*************************************************************************
 * Copyright (C) 1995-2017, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include <ROOT/RObjectDrawable.hxx>
#include <ROOT/RCanvas.hxx>
#include <TGraph.h>

#include <iostream>

// Show how to display v6 objects in a v7 RCanvas.

void draw_v6()
{
   using namespace ROOT::Experimental;

   static constexpr int npoints = 10;
   double x[npoints] = { 0., 1., 2., 3., 4., 5., 6., 7., 8., 9. };
   double y[npoints] = { .1, .2, .3, .4, .3, .2, .1, .2, .3, .4 };
   auto gr = std::make_shared<TGraph>(npoints, x, y);
   auto canvas = RCanvas::Create("v7 RCanvas showing a v6 TGraph");
   canvas->Draw<RObjectDrawable>(gr, "AL");

   // canvas->Show("opera");   // one could specify program name which should show canvas (like chromium or firefox)
   // canvas->Show("/usr/bin/chromium --app=$url &"); // one could use $url parameter, which replaced with canvas URL

   canvas->Show(); // new window in default browser should popup and async update will be triggered

   // synchronous, wait until painting is finished
   canvas->Update(false,
                  [](bool res) { std::cout << "First Update done = " << (res ? "true" : "false") << std::endl; });

   canvas->Modified(); // invalidate canvas and force repainting with next Update()

   // call Update again, should return immediately if canvas was not modified
   canvas->Update(false,
                  [](bool res) { std::cout << "Second Update done = " << (res ? "true" : "false") << std::endl; });

   // request to create PNG file in asynchronous mode and specify lambda function as callback
   // when request processed by the client, callback invoked with result value
   // canvas->SaveAs("draw.png", true,
   //               [](bool res) { std::cout << "Producing PNG done res = " << (res ? "true" : "false") << std::endl; });

   // this function executed in synchronous mode (async = false is default),
   // previous file saving will be completed at this point as well
   // canvas->SaveAs("draw.svg"); // synchronous
}