Skip to content
Snippets Groups Projects
primitives_jupyter.hpp 1.8 KiB
Newer Older
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
#ifndef PRIMITIVES_JUPYTER_H
#define PRIMITIVES_JUPYTER_H

Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
/**
   Variante de primitives.h pour dessiner dans Jupyter, sans la SFML

   CAVEAT: Ceci est une pure rustine, du genre que l'on bricole entre
   minuit et 3h du mat pour sauver un TP, en attendant une solution
   pérenne: backend Jupyter pour SFML, utilisation de xcanvas
   (https://github.com/martinRenou/xcanvas) l'équivalent de ipycanvas
   (https://ipycanvas.readthedocs.io/) pour C++, ou possibilité de
   lancer des applications graphiques sur JupyterHub.

   NE PRENNEZ PAS EXEMPLE DESSUS!
 **/

Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
#include <xcanvas/xcanvas.hpp>
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed

namespace Color {
    using Color = std::string;
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
    Color White = "White";
    Color Blue = "Blue";
    Color Red = "Red";
    Color Yellow = "Yellow";
    Color Green = "#00CC00";
    Color Black = "Black";
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
}

class Point {
    public:
    int x;
    int y;
    Point(int _x, int _y): x(_x), y(_y) {};
    Point(double _x, double _y): x(_x), y(_y) {};
};

class VideoMode {
    public:
    int width;
    int height;
    VideoMode(int w, int h): width(w), height(h) {}
};

Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
using Canvas = xw::xmaterialize<xc::xcanvas>;

Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
class RenderWindow {
    VideoMode vm;

    public:
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
    Canvas canvas;

Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
    RenderWindow(VideoMode _vm, std::string s) : vm(_vm) {
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
	vm = _vm;
	canvas = xc::canvas().initialize()
	    .width(vm.width)
	    .height(vm.height)
	    .finalize();
	canvas.cache();
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
    Canvas& get_canvas() {
	return canvas;
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
    }

    // Clear the canvas with the given color
    void clear(Color::Color color) {
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
	canvas.fill_style = color;
	canvas.fill_rect(0, 0, vm.width, vm.height);
	display();
    }

    void display() {
	canvas.flush();
	canvas.cache();
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
    }
};

void draw_point(RenderWindow &window, Point p, Color::Color color) {
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
    window.canvas.fill_style = color;
    window.canvas.fill_rect(p.x, p.y, 1, 1);
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed
}
Nicolas M. Thiéry's avatar
Nicolas M. Thiéry committed

#endif