topola 0.1.0

Work-in-progress free and open-source topological (rubberband) router and autorouter for printed circuit boards (PCBs)
Documentation
// SPDX-FileCopyrightText: 2026 Topola contributors
//
// SPDX-License-Identifier: MIT OR Apache-2.0

use std::ops::ControlFlow;

use derive_getters::Getters;

use crate::{
    AutoplacerSchedule, autoplacer::Autoplacer, board::Board, selections::ComponentSelection,
};

#[derive(Getters)]
pub struct Jostler {
    autoplacer: Autoplacer,
    /*prev_pointer: Option<Vector2<i64>>,
    selection: ComponentSelection,
    schedule: AutoplacerSchedule,*/
}

impl Jostler {
    pub fn new(board: &Board, selection: ComponentSelection, schedule: AutoplacerSchedule) -> Self {
        let infringees_selection = board.components_infringees(selection.clone());

        Self {
            autoplacer: Autoplacer::new(board, infringees_selection, schedule),
            /*prev_pointer: None,
            selection,
            schedule,*/
        }
    }

    pub fn step(&mut self, board: &mut Board) -> ControlFlow<()> {
        crate::profile_function!();

        self.autoplacer.step(board)
        //ControlFlow::Continue(())
    }

    /*pub fn hold(&mut self, board: &mut Board, _layer: LayerId, pointer: Vector2<i64>) {
        if let Some(prev_pointer) = self.prev_pointer {
            if pointer != prev_pointer {
                let infringees_selection = board.components_infringees(self.selection.clone());
                self.autoplacer.abort(board);

                self.autoplacer = Autoplacer::new(board, infringees_selection, self.schedule);
            }
        }

        self.prev_pointer = Some(pointer);
    }*/

    pub fn abort(&mut self, board: &mut Board) {
        crate::profile_function!();

        self.autoplacer.abort(board);
    }
}