1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
use text_editing::TextLine;

/// Represents from which type of element to which type of element an arrow should be drawn.
pub enum ArrowKind {
    /// An arrow from a place to a transition.
    PlaceToTransition,
    /// An arrow from a place to a placeplace.
    TransitionToPlace,
    /// An arrow from a place to a point.
    PlaceToPoint,
    /// An arrow from a point to a place.
    PointToPlace,
    /// An arrow from a transition to a point.
    TransitionToPoint,
    /// An arrow from a point to a transition.
    PointToTransition,
}

/// The renderer trait is used to display the elements of the petri net in a specific way.
/// Every drawing method starts with `draw_` and takes the `context` as t he first argument.
/// The positions are always given relative to the center without zoom applied.
/// Zoom has to be applied by the renderer.
pub trait Renderer {
    /// Renders some indications if simulation mode is enabled.
    fn draw_simulated(&mut self, simulated: bool);

    /// This draws a place of the petri net.
    /// Places should be visualized as circles with radius `RAD`.
    ///
    /// * `pos`: The center of the place.
    /// * `name`: The name of the place as char array.
    /// * `name_cursor`: The position of the cursor inside the name.
    /// * `show_cursor`: Indicates if the cursor is shown for this place.
    /// * `count`:
    ///     The token count of the place.
    ///     A different visualization is recommended if it contains at least one token.
    /// * `selected`: Indicates if the place is currently selected.
    fn draw_place(
        &mut self,
        x: f32,
        y: f32,
        radius: f32,
        zoom: f32,
        name: &TextLine,
        name_cursor: usize,
        show_cursor: bool,
        count: u32,
        selected: bool,
    );

    /// This draws a transition of the petri net.
    /// Places should be visualized as rectangles with width `WIDTH` and height `HEIGHT`.
    ///
    /// * `pos`: The center of the transition.
    /// * `name`: The name of the transition as char array.
    /// * `name_cursor`: The position of the cursor inside the name.
    /// * `show_cursor`: Indicates if the cursor is shown for this transition.
    /// * `selected`: Indicates if the transition is currently selected.
    /// * `forward`: Indicates if the transition can fire.
    /// * `backwards`: Indicates if the transition can fire backwards.
    fn draw_transition(
        &mut self,
        x: f32,
        y: f32,
        width: f32,
        height: f32,
        zoom: f32,
        name: &TextLine,
        name_cursor: usize,
        show_cursor: bool,
        selected: bool,
        forward: bool,
        backwards: bool,
    );

    /// This draws a line from position `from` to position `to`.
    /// Lines are used for visualizing nodes with multiple instances.
    fn draw_line(&mut self, from_x: f32, from_y: f32, to_x: f32, to_y: f32, zoom: f32);

    /// This draws an arrow from an element at position `from` to an element at position `to`.
    /// An element is either a place, a transition or a point.
    /// Both elements are of a different type. The element types are specified by `arrow_kind`.
    /// Depending on the element type, there might need to be different offsets or different curvatures.
    fn draw_arrow(
        &mut self,
        from_x: f32,
        from_y: f32,
        to_x: f32,
        to_y: f32,
        radius: f32,
        width: f32,
        height: f32,
        zoom: f32,
        arrow_kind: ArrowKind,
    );

    /// This draws a global input text field. The position is not further specified, so it can be anywhere.
    ///
    /// * `text`: The text in the field.
    /// * `cursor`: The position of the cursor inside the text.
    fn draw_field(&mut self, text: &TextLine, cursor: usize);

    /// This draws a box for when the user selects multiple objects using a box.
    /// `corner1` and `corner2` are the positions of two opposite corners of the box.
    fn draw_select_box(&mut self, x1: f32, y1: f32, x2: f32, y2: f32, zoom: f32);

    /// This draws a text box, which might contains multiple lines of text.
    ///
    /// * `text`: The text as a list of lines, which are each represented as a list of lines.
    /// * `cursor`: The cursor position on the specified line.
    /// * `line`: The line, where the cursor currently is.
    /// * `offset`: Indicates by how many lines the text is moved up.
    fn draw_text_box(&mut self, text: &Vec<TextLine>, cursor: usize, line: usize, offset: usize);

    /// Finishes rendering of a single frame.
    fn finish(&mut self);
}