X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=LogicUI%2Fsrc%2Fera%2Fmi%2Fgui%2FLogicUICanvas.java;h=6610e2e3d30cccde648ee22be5ef5111a15ecddd;hb=d27165bc7b5dcff6c1e3d7f88f7195c5418ab9df;hp=fd6d4daa030e919e9d55679a1dc011b3e335c3df;hpb=da0a4b7d0619283bb4384091356ce3f105c84e78;p=Mograsim.git diff --git a/LogicUI/src/era/mi/gui/LogicUICanvas.java b/LogicUI/src/era/mi/gui/LogicUICanvas.java index fd6d4daa..6610e2e3 100644 --- a/LogicUI/src/era/mi/gui/LogicUICanvas.java +++ b/LogicUI/src/era/mi/gui/LogicUICanvas.java @@ -1,19 +1,18 @@ package era.mi.gui; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.function.Consumer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; -import era.mi.gui.components.BasicGUIComponent; -import era.mi.gui.wires.GUIWire; +import era.mi.gui.model.ViewModel; +import era.mi.gui.model.components.GUIComponent; +import era.mi.gui.model.wires.GUIWire; +import era.mi.gui.model.wires.Pin; import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.gcs.TranslatedGC; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas; /** @@ -23,53 +22,79 @@ import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas; */ public class LogicUICanvas extends ZoomableCanvas { - private final Set components; - private final Map componentPositions; - private final Set wires; + private static final boolean DRAW_PINS = false; - public LogicUICanvas(Composite parent, int style) + private final ViewModel model; + + public LogicUICanvas(Composite parent, int style, ViewModel model) { super(parent, style); - components = new HashSet<>(); - componentPositions = new HashMap<>(); - wires = new HashSet<>(); + this.model = model; - addZoomedRenderer(gc -> components.forEach(c -> drawComponent(gc, c))); - addZoomedRenderer(gc -> wires.forEach(w -> w.render(gc))); - addListener(SWT.MouseDown, this::mouseDown); - } - - /** - * Add a component to be drawn. Returns the given component for convenience. - * - * @author Daniel Kirschten - */ - public C addComponent(C component, double x, double y) - { - components.add(component); - componentPositions.put(component, new Point(x, y)); - return component; - } + Consumer redrawConsumer = o -> redrawThreadsafe(); + Consumer pinAddedListener = p -> + { + p.addPinMovedListener(redrawConsumer); + redrawThreadsafe(); + }; + Consumer pinRemovedListener = p -> + { + p.removePinMovedListener(redrawConsumer); + redrawThreadsafe(); + }; + Consumer componentAddedListener = c -> + { + c.addComponentLookChangedListener(redrawConsumer); + c.addComponentMovedListener(redrawConsumer); + c.addPinAddedListener(pinAddedListener); + c.addPinRemovedListener(pinRemovedListener); + redrawThreadsafe(); + }; + model.addComponentAddedListener(componentAddedListener); + model.getComponents().forEach(componentAddedListener); + model.addComponentRemovedListener(c -> + { + c.removeComponentLookChangedListener(redrawConsumer); + c.removeComponentMovedListener(redrawConsumer); + c.removePinAddedListener(pinAddedListener); + c.removePinRemovedListener(pinRemovedListener); + redrawThreadsafe(); + }); + Consumer wireAddedListener = w -> + { + w.addWireLookChangedListener(redrawConsumer); + redrawThreadsafe(); + }; + model.addWireAddedListener(wireAddedListener); + model.getWires().forEach(wireAddedListener); + model.addWireRemovedListener(w -> + { + w.removeWireLookChangedListener(redrawConsumer); + redrawThreadsafe(); + }); - /** - * Add a graphical wire between the given connection points of the given components. The given components have to be added and the given - * connection points have to be connected logically first. - * - * @author Daniel Kirschten - */ - public void addWire(BasicGUIComponent component1, int component1ConnectionIndex, BasicGUIComponent component2, - int component2ConnectionIndex, Point... path) - { - wires.add(new GUIWire(this::redrawThreadsafe, component1, component1ConnectionIndex, componentPositions.get(component1), component2, - component2ConnectionIndex, componentPositions.get(component2), path)); + addZoomedRenderer(gc -> + { + Rectangle visibleRegion = new Rectangle(offX, offY, gW / zoom, gH / zoom); + model.getComponents().forEach(c -> drawComponent(gc, c, visibleRegion)); + }); + addZoomedRenderer(gc -> model.getWires().forEach(w -> w.render(gc))); + addListener(SWT.MouseDown, this::mouseDown); } - private void drawComponent(GeneralGC gc, BasicGUIComponent component) + private void drawComponent(GeneralGC gc, GUIComponent component, Rectangle visibleRegion) { - TranslatedGC tgc = new TranslatedGC(gc, componentPositions.get(component)); - component.render(tgc); - tgc.setBackground(getDisplay().getSystemColor(SWT.COLOR_BLUE)); + component.render(gc, visibleRegion); + if (DRAW_PINS) + { + gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_DARK_CYAN)); + for (Pin p : component.getPins()) + { + Point pos = p.getPos(); + gc.fillOval(pos.x - 1, pos.y - 1, 2, 2); + } + } } private void mouseDown(Event e) @@ -77,11 +102,10 @@ public class LogicUICanvas extends ZoomableCanvas if (e.button == 1) { Point click = displayToWorldCoords(e.x, e.y); - for (BasicGUIComponent component : components) - if (component.getBounds().translate(componentPositions.get(component)).contains(click)) + for (GUIComponent component : model.getComponents()) + if (component.getBounds().contains(click) && component.clicked(click.x, click.y)) { - if (component.clicked(click.x, click.y)) - redraw(); + redraw(); break; } }