private void SortList()
    {
        List <string> cardNames = new List <string> ();

        framesToWait = true;
        foreach (GameObject findedPanelOb in PanelsInDeckList)
        {
            cardDescStruct newCard     = new cardDescStruct();
            CardPanel      findedPanel = findedPanelOb.GetComponent <CardPanel> ();
            newCard.CardName = findedPanel.PanelCardName;
            if (findedPanel.Card != null)
            {
                newCard.Card = findedPanel.Card;
            }
            newCard.CardsNumber = findedPanel.CardsNumber;
            PanelsInDeckCards.Add(newCard);
            cardNames.Add(findedPanel.PanelCardName);
            Destroy(findedPanel.PrevCard);
            findedPanel.DestroyPanelOnly();
        }
        PanelsInDeckList.Clear();
        cardNames = CardsBaseComponent.SortCardsList(cardNames);
        foreach (string cardName in cardNames)
        {
            GameObject panel     = Instantiate(CardPanel);
            CardPanel  panelComp = panel.GetComponent <CardPanel> ();
            panel.transform.SetParent(CardsInDeckTable, false);
            panelComp.PanelInDeck = true;
            foreach (cardDescStruct cardStOb in PanelsInDeckCards)
            {
                if (string.Compare(cardStOb.CardName, cardName) == 0)
                {
                    panelComp.KeepCardPosition = false;
                    panelComp.CardPosReached   = false;
                    if (cardStOb.Card != null)
                    {
                        panelComp.AddCard(cardStOb.Card);
                    }
                    panelComp.PanelCardName = cardStOb.CardName;
                    panelComp.CardsNumber   = cardStOb.CardsNumber;
                    panelComp.RefreshCardsNumber();
                    break;
                }
            }
            PanelsInDeckList.Add(panel);
        }
        PanelsInDeckCards.Clear();
    }
    public void RemoveCard(string cardName)
    {
        Debug.Log("Remove card from deck:" + cardName);

        DeckTableControllerComponent.RemoveCardFromDeck(CardsBaseComponent.GetIdByName(cardName).ToString());
        CardsInDeckNames.Remove(cardName);
        foreach (GameObject findedPanelOb in PanelsInDeckList)
        {
            if (findedPanelOb != null)
            {
                CardPanel findedPanel = findedPanelOb.GetComponent <CardPanel> ();
                if (findedPanel != null)
                {
                    if (findedPanel.PanelCardName == cardName)
                    {
                        findedPanel.CardsNumber--;
                        findedPanel.RefreshCardsNumber();
                        if (findedPanel.CardsNumber < 1)
                        {
                            findedPanel.DestroyPanel();
                            PanelsInDeckList.Remove(findedPanelOb);
                            break;
                        }
                    }
                }
                else
                {
                    CardViewPanel panel = findedPanelOb.GetComponent <CardViewPanel> ();
                    if (panel != null)
                    {
                        if (panel.PanelPawn.GetComponent <Pawn> ().Name == cardName)
                        {
                            PanelsInDeckList.Remove(findedPanelOb);
                            //Destroy (findedPanelOb);
                            break;
                        }
                    }
                }
            }
        }
    }
    private IEnumerator LoadCardPoolTask(Hero hero)
    {
        PoolUnload = false;
        while (PoolLoading)
        {
            yield return(new WaitForSeconds(0.01f));
        }
        PoolLoading = true;
        List <CardsBase.CardDescriptionClass> cardsList;
        Color panelColor = Color.white;

        if (hero != null)
        {
            cardsList   = CardsBaseComponent.GetCardsList(hero.CardsPool);
            panelColor  = hero.HeroColor;
            CurrentHero = hero;
            Debug.Log(" Load Card pool for: " + hero.Name + " pool:" + hero.CardsPool);
        }
        else
        {
            cardsList = CardsBaseComponent.GetCardsList(CardsBase.SelectedHeroCards.Uniwersal);
            Debug.Log(" Load Card uniwersal pool");
        }
        foreach (CardsBase.CardDescriptionClass cardToSpawn in cardsList)
        {
            if (PoolUnload)
            {
                break;
            }
            bool FilterOut = false;

            //public List<string> RarityFilterList = new List<string>() {"Wszystkie", "Srebrne", "Złote", "Diamentowe"};
            //public List<string> RolesFilterList = new List<string>() {"Wszystkie role", "Ofensywne", "Defensywne", "Wspierające"};

            if ((CurrentRarityFilter == 1) && (cardToSpawn.Rarity != CardInteraction.CardRarityEnum.common))
            {
                FilterOut = true;
            }
            else if ((CurrentRarityFilter == 2) && (cardToSpawn.Rarity != CardInteraction.CardRarityEnum.gold))
            {
                FilterOut = true;
            }
            else if ((CurrentRarityFilter == 3) && (cardToSpawn.Rarity != CardInteraction.CardRarityEnum.diamond))
            {
                FilterOut = true;
            }
            if ((CurrentRoleFilter == 1) && (cardToSpawn.Role != CardInteraction.CardRoleEnum.offence))
            {
                FilterOut = true;
            }
            else if ((CurrentRoleFilter == 2) && (cardToSpawn.Role != CardInteraction.CardRoleEnum.defence))
            {
                FilterOut = true;
            }
            else if ((CurrentRoleFilter == 3) && (cardToSpawn.Role != CardInteraction.CardRoleEnum.support))
            {
                FilterOut = true;
            }

            if (!FilterOut)
            {
                GameObject card = CardsBaseComponent.SpawnCard(cardToSpawn, true);
                if (card)
                {
                    CardInteraction CardInter = card.GetComponent <CardInteraction> ();
                    GameObject      panel     = Instantiate(CardPanel);
                    CardPanel       panelComp = panel.GetComponent <CardPanel> ();

                    if (!cardToSpawn.CardUnlocked)
                    {
                        if (ShowAllToggle.isOn)
                        {
                            card.GetComponent <SpriteRenderer> ().color = new Color(1f, 1f, 1f, 0.5f);
                        }
                        else
                        {
                            FilterOut = true;
                        }
                    }

                    if (SetCardAsButtonChild)
                    {
                        card.transform.SetParent(panel.transform);
                    }
                    else
                    {
                        card.transform.SetParent(CardsBasePositionRoot);
                    }
                    card.transform.position = new Vector3(-10000, 0, 0);                     //just keep card outside of camera
                    card.GetComponent <CardInteraction> ().SetCardOrder(1);
                    if (collectionMode)
                    {
                        panel.transform.SetParent(CardsCollectionTable, false);
                        card.transform.localScale = InCollectionCardScale;
                        panelComp.BuildDeckMode   = false;
                    }
                    else
                    {
                        panel.transform.SetParent(CardsBaseTable, false);
                        //card.transform.localScale = InTableCardScale;
                        card.transform.localScale = InCollectionCardScale;
                        panelComp.BuildDeckMode   = true;
                    }
                    if (cardToSpawn.NewlyUnlocked)
                    {
                        panelComp.NewNotifyObject = Instantiate(NewCardNotifyPrefab, panel.transform);
                    }

                    panelComp.PanelInDeck             = false;
                    panelComp.PanelButton.image.color = panelColor;
                    panelComp.AddCard(card);
                    panelComp.KeepCardPosition = true;
                    panelComp.CardsNumber      = cardToSpawn.Quantity;
                    panelComp.RefreshCardsNumber();
                    card.transform.position = panel.transform.position;
                    PanelsInCardsList.Add(panel);
                    yield return(new WaitForSeconds(0.01f));
                }
            }
            //Debug.Log ("set card from current pos: " + card.transform.position + " to new pos: " + panel.transform.position);
        }
        PoolLoading = false;
        yield return(null);
    }
    private void AddCardToTable(string cardName, Vector3 startCardGlobalPosition, bool noAnim, List <GameObject> spawnedPawns = null)
    {
        GameObject card = null;
        GameObject pawn = null;

        if (DeckBuildV2 && spawnedPawns != null)
        {
            pawn = FindSpawnedCard(spawnedPawns, cardName);
        }
        if (pawn == null)
        {
            card = CardsBaseComponent.SpawnCardByName(cardName);
        }

        if (DeckBuildV2)
        {
            bool availble = true;
            if (card)
            {
                //availble = CheckCardQuantity (cardName);
                pawn = card.transform.Find("Pawn").gameObject;
                pawn.transform.SetParent(CardsInDeckPositionRoot);
                Destroy(card);
            }
            if (availble)
            {
                CardsInDeckNames.Add(pawn.GetComponent <Pawn>().Name);
                CardsInDeckNames = CardsBaseComponent.SortCardsList(CardsInDeckNames);
                GameObject panel = Instantiate(DeckPanelV2Prefab);
                if (panel != null)
                {
                    panel.transform.SetParent(DeckBuildV2Table.transform, false);
                    panel.transform.SetSiblingIndex(CardsInDeckNames.IndexOf(pawn.GetComponent <Pawn>().Name));
                    PanelsInDeckList.Add(panel);
                    if (pawn != null)
                    {
                        CardViewPanel panelView = panel.GetComponent <CardViewPanel> ();
                        pawn.GetComponent <KeepParentRenderLayer> ().KeepingActive    = false;
                        pawn.gameObject.GetComponent <SpriteRenderer> ().sortingOrder = 55;
                        pawn.transform.SetParent(CardsInDeckPositionRoot);
                        pawn.transform.position = startCardGlobalPosition;
                        panelView.SetPawn(pawn, null);
                        panelView.TableWidth = DeckBuildV2Table.GetComponent <RectTransform> ().rect.width;
                        panelView.MovePawn(true);
                        panelView.CardsControllerComp = GetComponent <CardsBaseTableController> ();
                        pawn.transform.localScale     = InTableCardScale;
                    }
                }
            }
            else
            {
                DeckTableControllerComponent.RemoveCardFromDeck(cardName);
            }
        }
        else
        {
            GameObject panel;
            bool       panelFinded = false;
            CardPanel  panelComp;

            if (card)
            {
                card.transform.SetParent(CardsInDeckPositionRoot);
                card.transform.localScale = InTableCardScale;
                card.transform.position   = startCardGlobalPosition;
                card.GetComponent <CardInteraction> ().SetCardOrder(3);
                foreach (GameObject findedPanelOb in PanelsInDeckList)
                {
                    CardPanel findedPanel = findedPanelOb.GetComponent <CardPanel> ();
                    if (findedPanel.PanelCardName == cardName)
                    {
                        CardInteraction CardInter = card.GetComponent <CardInteraction> ();
                        bool            availble  = true;
                        if ((CardInter.CardRarity == CardInteraction.CardRarityEnum.common) &&
                            (findedPanel.CardsNumber >= 3))
                        {
                            availble = false;
                        }
                        else if ((CardInter.CardRarity == CardInteraction.CardRarityEnum.gold) &&
                                 (findedPanel.CardsNumber >= 2))
                        {
                            availble = false;
                        }
                        else if ((CardInter.CardRarity == CardInteraction.CardRarityEnum.diamond) &&
                                 (findedPanel.CardsNumber >= 1))
                        {
                            availble = false;
                        }
                        if (availble)
                        {
                            findedPanel.CardsNumber++;
                            findedPanel.RefreshCardsNumber();
                            panelComp = findedPanel;
                            //panelComp.KeepCardPosition = false;
                            if (noAnim)
                            {
                                Destroy(card);
                            }
                            panelComp.AddCard(card);
                            //panelComp.SmoothMoveCard ();
                            //panelComp.KeepCardPosition = true;
                        }
                        else
                        {
                            DeckTableControllerComponent.RemoveCardFromDeck(cardName);
                            Destroy(card);
                        }
                        panelFinded = true;
                    }
                }
                if (panelFinded == false)
                {
                    panel     = Instantiate(CardPanel);
                    panelComp = panel.GetComponent <CardPanel> ();
                    panel.transform.SetParent(CardsInDeckTable, false);
                    panelComp.PanelInDeck = true;
                    //panelComp.KeepCardPosition = false;
                    panelComp.PanelCardName = cardName;
                    panelComp.AddCard(card);
                    //panelComp.SmoothMoveCard ();
                    panelComp.RefreshCardsNumber();
                    //panelComp.KeepCardPosition = true;
                    PanelsInDeckList.Add(panel);
                    SortList();
                }
            }
        }
    }