
#include <QList>
#include <QMimeData>
#include <QApplication>
#include <QClipboard>
#include "iteminfo.h"
#include "mainwindow.h"
///////////////////////////////////////////
// Копирование выделенных элеменов в буфер обмена
void MainWindow::copyItem()
{
    QList<ItemInfo> infos;
    QList<QGraphicsItem *> items;


    // Находим выделенныt элементs на сцене
    foreach (QGraphicsItem *item, scene->selectedItems())
    {
        if (item->type() == DiagramItem::Type)
        {
            items.append(item);
        }
    }

    // Гененрируем массив байтов с информациями об этих инфо
    // На будущее - добавить стрелки между скопированными элеменатми, висячие стрелки каждого элемента.
    // стрелки от выделенного к невыделенному элементу - не учитывать.
    QByteArray arr; // наш массив, который будем передавать.
    arr.append(QString::number(items.size())); // записываем количесвто элементов.
    arr.append("endSize");

    //перебираем все выделенные итемы, выбираем из них их координаты.
    // На будущее - в данный момент функция getByteInfo() сохраняет только координаты.
    // Надо залезть и расширить ее до собственно комментариев и айдишников.
    for(int i = 0; i< items.size(); i++)
    {
        ItemInfo info= qgraphicsitem_cast<DiagramItem *>(items[i])->getItemInfo();
        infos.append(info); // нужен для того, чтобы потом искать стрелки.
        arr.append(info.getByteInfo());
        arr.append("endInfo");
    }

    // Создаем обьект для передачи его в буфер обмена
    QMimeData* data = new QMimeData();
    data->setData("ideeditor/diagramiteminfo", arr); // На, нах если по другому не работаешь!
    clipBoard->setMimeData(data);

    qDebug("Copy Completed");
}
void MainWindow::pasteItem()
{

/*
    // Создается объект для приема данных
    DiagramItem *item;
    const QMimeData *mdata;
    QByteArray arr;
    QStringList format = QApplication::clipboard()->mimeData()->formats(); // отладочная информация, удалить.
    //Проверяем, наши ли данные лежат в буфере обмена.
    bool test = QApplication::clipboard()->mimeData()->hasFormat("ideeditor/diagramiteminfo");
    if (test == true)
    {

        // Получаем обьект из буфера обмена.
        mdata = QApplication::clipboard()->mimeData();
        arr = mdata->data("ideeditor/diagramiteminfo");
        //Парсим массив.
        int cursorPosition = 0; // Позиция курсора парсера
        //Получаем количество итемов.
        int sizePos = arr.indexOf("endSize"); // нашли координату метки
        cursorPosition = sizePos+7;
        int len = arr.mid(0, sizePos).toInt(); // прочитали до этой метки и перевели в число.
        for(int i = 0; i<len; i++)
        {
            // нашли координату конца записи об итеме.
            int itemPosEnd = arr.indexOf("endInfo", cursorPosition);
            // Прочитали информацию об итеме
            QByteArray itemInfoArr = arr.mid(cursorPosition,itemPosEnd-cursorPosition );
            ItemInfo info;
            info.fromByteInfo(itemInfoArr); // Распарсили эту информацию внутри итема
            item = new DiagramItem(info);
            scene->addItem(item);
           // manager.items.append(); // Добавили итем в манагер.
            cursorPosition+=itemInfoArr.size()+7;
        }
    }
    manager.draw_items(); //перерисовали нашу сцену.
*/
    qDebug("Paste Completed");
}

/*
 Как работает буфер обмена.
Сперва мы находим все выделенные элементы на сцене.
Затем (реализовано только блоки) мы записываем количесвто элементов
После этого мы читаем по отрезку массива, который соотвествует одному итемИнфо.
Ключевая метка для его конца - endInfo.
Этот кусок массива мы скармливаем ItemInfo, где происходит обратный парсинг его во
внутренние значения (на аднный момент реализованы только координаты)
Затем мы добавляем этот элемент в манагер и перерисовываем сцену.
пример как это все выглядит для 2х элементов:
=======================
2               - количество записей
 endSize        - метка конца описания количества записей, нужна потому что количество может быть больше 9, значит надо считывать 2 байта
      3         - длина координаты Х
      endXSixe  - метка конца описания длины Х
      777       - само значение координаты Х
      3         - длина координаты У
      ednYSize
      666
  endInfo       - метка конца записи
      3
      endXSixe
      555
      3
      ednYSize
      444
  endInfo
======================

Необходимо дописать в парсер и конвертер осальные поля, поправить баги,
Сделать аналогичную работу для стрелок, предусмотреть там варианты того,
что стрелки окажутся висячими потому что нет блока с таким айдишником.

 */
