text: /*
  * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or 
  * a third party where indicated.
  *
  * For complete copyright and license terms please see the LICENSE at the root of this
  * distribution (the "License"). All use of this software is governed by the License,  
  * or, if provided, by the license below or the license accompanying this file. Do not
  * remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  *
  */
  #include "EditorUI_QT_Precompiled.h"
  #include "AttributeGroup.h"
  #include "AttributeView.h"
  #include "AttributeListView.h"
  #include <AttributeGroup.moc>
  
  #include "AttributeView.h"
  
  // EditorCore
  #include <Util/Variable.h>
  #include <Util/VariablePropertyType.h>
  
  // QT
  #include <QLabel>
  #include <QLayout>
  
  #include "Utils.h"
  #include "AttributeItem.h"
  
  CAttributeGroup::CAttributeGroup(QWidget* parent, CAttributeItem* content)
      : QWidget(parent)
  {
      Init();
      SetContent(content);
  }
  
  CAttributeGroup::CAttributeGroup(QWidget* parent)
      : QWidget(parent)
  {
      Init();
  }
  
  void CAttributeGroup::Init()
  {
      m_layout = new QVBoxLayout(this);
      setLayout(m_layout);
      setContentsMargins(QMargins(1, 1, 1, 1));
      m_layout->setMargin(0);
      m_layout->setContentsMargins(0, 0, 0, 0);
      setMouseTracking(true);
      setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum);
      m_attributeConfigItem = nullptr;
      m_attributeConfigGroup = nullptr;
  }
  
  
  CAttributeGroup::~CAttributeGroup()
  {
  }
  
  void CAttributeGroup::SetContent(CAttributeItem* content)
  {
      m_layout->addWidget(content);
      m_content = content;
      content->setParent(this);
  }
  
  void CAttributeGroup::SetConfigGroup(const CAttributeViewConfig::config::group* config)
  {
      m_attributeConfigGroup = config;
  }
  
  void CAttributeGroup::SetConfigItem(const CAttributeViewConfig::config::item* item)
  {
      m_attributeConfigItem = item;
  }
  
  
  void CAttributeGroup::mousePressEvent(QMouseEvent* event)
  {
      if (event->button() == Qt::LeftButton)
      {
          m_dragStartPoint = event->pos();
          CAttributeItem* previousattribute = (static_cast<CAttributeItem*>(this->parent()->parent()));
          CAttributeView* attributeView = previousattribute->getAttributeView();
          //Set style for multi-selection
          attributeView->AddSelectedAttribute(this);
      }
      QWidget::mousePressEvent(event);
  }
  
  void CAttributeGroup::mouseMoveEvent(QMouseEvent* event)
  {
      if (!(event->buttons() & Qt::LeftButton))
      {
          return;
      }
      if ((event->pos() - m_dragStartPoint).manhattanLength()
          < QApplication::startDragDistance())
      {
          return;
      }
  
      CAttributeItem* previousattribute = (static_cast<CAttributeItem*>(this->parent()->parent()));
      CAttributeView* attributeView = previousattribute->getAttributeView();
  
      attributeView->AddDragAttribute(this);
  
      QVector<CAttributeGroup*> selectedGroups = attributeView->GetSelectedGroups();
  
      QDrag* drag = new QDrag(this);
      QMimeData* mimeData = new QMimeData;
      mimeData->setData("AttributeGroup", "");
  
      int pixHeight = 0;
      for (int i = 0; i < selectedGroups.size(); i++)
      {
          CAttributeGroup* group = selectedGroups[i];
          pixHeight += group->height();
      }
  
      // Create new picture for transparent
      QPixmap transparent(width(), pixHeight);
      // Do transparency
      transparent.fill(Qt::transparent);
      QPainter p;
      p.begin(&transparent);
      p.setCompositionMode(QPainter::CompositionMode_Source);
  
      int drawHeight = 0;
      for (int i = 0; i < selectedGroups.size(); i++)
      {
          CAttributeGroup* group = selectedGroups[i];
          p.drawPixmap(0, drawHeight, group->grab(QRect(QPoint(0, 0), QPoint(group->width(), group->height()))));
          drawHeight += group->height();
      }
      p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
  
      // Set transparency level to 150 (possible values are 0-255)
      // The alpha channel of a color specifies the transparency effect,
      // 0 represents a fully transparent color, while 255 represents
      // a fully opaque color.
      p.fillRect(transparent.rect(), QColor(0, 0, 0, 150));
      p.end();
  
      drag->setPixmap(transparent);
      drag->setMimeData(mimeData);
  
      Qt::DropAction dropAction = drag->exec(Qt::CopyAction);
  
      attributeView->ClearAttributeSelection();
  }
  
  // Override the paintEvent so we could use setProperty for widget style
  void CAttributeGroup::paintEvent(QPaintEvent*)
  {
      QStyleOption opt;
      opt.init(this);
      QPainter p(this);
      style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
  }
  
  bool CAttributeGroup::DropAGroup(CAttributeItem* dropAtAttributeItem, QWidget* insertAtGroup, int positionIndex)
  {
      CAttributeItem* previousattribute = (static_cast<CAttributeItem*>(parent()->parent()));
      CAttributeListView* previousdockPanel = static_cast<CAttributeListView*>(previousattribute->parentWidget());
      if (dropAtAttributeItem == previousattribute) // the same panel, start re-ordering
      {
          if (previousdockPanel->isCustomPanel()) // Only re-ordering on custom panel
          {
              previousattribute->RemoveDragableGroup(this);
              dropAtAttributeItem->InsertDragableGroup(GetConfigItem(), GetConfigGroup(), insertAtGroup, positionIndex);
              if (previousattribute->getChildren().size() > 0)
              {
                  previousattribute->HideDefault();
              }
              else
              {
                  previousattribute->ShowDefault();
              }
          }
      }
      else
      {
          if (dropAtAttributeItem->InsertDragableGroup(GetConfigItem(), GetConfigGroup(), insertAtGroup, positionIndex)) // check if insertable
          {
              if (dropAtAttributeItem->getChildren().size() > 0)
              {
                  dropAtAttributeItem->HideDefault();
              }
              else
              {
                  dropAtAttributeItem->ShowDefault();
              }
              // Remove Item from previous panel. The Item only get removed from custom panel
  
              if (previousdockPanel->isCustomPanel())
              {
                  previousattribute->RemoveDragableGroup(this);
                  if (previousattribute->getChildren().size() > 0)
                  {
                      previousattribute->HideDefault();
                  }
                  else
                  {
                      previousattribute->ShowDefault();
                  }
              }
          }
          else
          {
              QString name = "";
              // Pop error dialog
              if (m_attributeConfigGroup)
              {
                  name = m_attributeConfigGroup->name;
              }
              else if (m_attributeConfigItem)
              {
                  name = m_attributeConfigItem->name;
              }
  
              QString text = "Attribute \"" + name + "\" already exists in the panel\n";
              QMessageBox::warning(this, "Warning", text, "Ok");
  
              //  Clear selected style after drop
              SetDragStyle("None");
              return false;
          }
      }
      //  Clear selected style after drop
      SetDragStyle("None");
  
      return true;
  }
  
  void CAttributeGroup::SetDragStyle(QString DragStatus)
  {
      setProperty("DragStatus", DragStatus);
      style()->unpolish(this);
      style()->polish(this);
      update();
  }
  