/*
Copyright 2006-2026 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see .
*/
#ifndef CABLECOPY_H
#define CABLECOPY_H
#include "cable.h"
#include
#include
class CablePart;
class Conductor;
class Diagram;
class QDomDocument;
class QDomElement;
class QUndoCommand;
/**
@brief Carrying a drawn cable line over into a copy -- through the
clipboard (Ctrl+C then Ctrl+V) or as a duplicate (Ctrl+D).
What travels is the line and everything which made the cable what it
was: its type, its installation, the place it runs through, its
length, how many cores it has, which colours those have -- and where
the colour labels of the copied section stand, so a copy arrives as
a whole even onto a folio which holds no wire at all. What does not
travel is which wire each core is on: a copy is a cable of its own
with a number of its own, and it takes the wire each colour label
happens to stand on at the place it is put -- those of the folio it
lands on which no other cable describes. A wire another cable
already holds is left to that cable, and a label put where there is
no wire goes on standing there, to be wired when the line is pulled
into place.
A cable line is not one of the folio's items (the cable owns it),
so Diagram::toXml() never writes it: the block travels beside the
folio's own XML rather than inside it, and Diagram::fromXml() reads
it back only when its caller asks to be handed the lines it built.
*/
namespace CableCopy
{
///Put the cable lines selected on @a diagram into @a document
void write(Diagram *diagram, QDomDocument &document);
///Build new cables of their own for the lines @a root holds,
///at the coordinates the fragment carries, with the colour
///labels of the copied section carried over as they were.
///Nothing is asked and no wire is taken yet: that needs the
///place the lines have really been put at, which only the
///caller knows
QList read(Diagram *diagram, const QDomElement &root);
///One core of a line, and the wire it was given
struct Bound
{
int core = -1;
Conductor *conductor = nullptr;
};
///One line which was built, with what it had to take away
struct Wired
{
QPointer part;
QList taken;
///The wires the colour labels of this line were given,
///so they can be pointed at them again afterwards
QList bound;
};
///Give each colour label of a line the wire it stands on now
///that the line is where it will stay.
///
///@a fresh lists the wires which came along with the copy
///itself. They are new wires on this folio: the cable field
///they carry describes the folio they were copied from, where
///they used to be one of that cable's own wires -- and carried
///over, that reference would make every one of them look like
///a wire some other cable holds, so the copy would be refused
///all of them and arrive without a single entry although it is
///standing on wires of its own. They are let go of first, the
///same way read() lets go of the wires the cores used to name.
///
///A wire the folio already held, which another cable
///describes, is never taken away from that cable: nothing is
///asked and nothing is written for it, and the colour label
///standing on it simply names nothing until the user drags it
///onto a free wire himself, which is where the question is
///still asked. A label standing on no wire at all goes on
///standing where it is, to be wired when the line is pulled
///into place.
QList wire(Diagram *diagram,
const QList &parts,
const QList &fresh);
///Point the cores @a wired lists at the wires they were given,
///again: putting the copy on the undo stack may have renewed
///the identity of a pasted conductor (PasteDiagramCommand::redo),
///and a cable binds a wire by its identity. Nothing is asked and
///nothing moves here. The cable fields are written out once more
///afterwards, from the cables themselves, so the entries a copy
///was given as it was put down are on the wires it really
///landed on rather than on the identity they had one moment
///earlier.
void repoint(const QList &wired);
///Take a built line back off the folio without leaving a trace
///in the undo history, for a copy which was refused
void discard(Diagram *diagram, CablePart *part);
}
#endif // CABLECOPY_H