File indexing completed on 2024-04-21 04:02:02

0001 /*
0002     KBlackBox - A simple game inspired by an emacs module
0003 
0004     SPDX-FileCopyrightText: 1999-2000 Robert Cimrman <cimrman3@students.zcu.cz>
0005     SPDX-FileCopyrightText: 2007 Nicolas Roffet <nicolas-kde@roffet.com>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include "kbbgraphicsitemset.h"
0011 
0012 
0013 
0014 #include <QGraphicsScene>
0015 
0016 
0017 #include "kbbgraphicsitem.h"
0018 #include "kbbitemwithposition.h"
0019 
0020 
0021 
0022 //
0023 // Constructor / Destructor
0024 //
0025 
0026 KBBGraphicsItemSet::KBBGraphicsItemSet(QGraphicsScene* scene)
0027 {
0028         m_scene = scene;
0029 }
0030 
0031 
0032 KBBGraphicsItemSet::~KBBGraphicsItemSet()
0033 {
0034     clear();
0035 }
0036 
0037 
0038 
0039 //
0040 // Public
0041 //
0042 
0043 int KBBGraphicsItemSet::anyItemPosition()
0044 {
0045         if (!m_items.isEmpty())
0046         return m_items.last()->position();
0047     else
0048         return NO_INDEX;
0049 }
0050 
0051 
0052 int KBBGraphicsItemSet::count() const
0053 {
0054     return m_items.count();
0055 }
0056 
0057 
0058 void KBBGraphicsItemSet::clear()
0059 {
0060     while (m_items.count()>0) {
0061         remove(m_items.last()->position());
0062     }
0063 }
0064 
0065 
0066 bool KBBGraphicsItemSet::contains(int position)
0067 {
0068     return (indexOf(position)!=NO_INDEX);
0069 }
0070 
0071 
0072 bool KBBGraphicsItemSet::containsVisible(int position)
0073 {
0074     int i = indexOf(position);
0075 
0076     if (i!=NO_INDEX) {
0077         if(dynamic_cast<KBBGraphicsItem*>(m_items[i]))
0078             return ((dynamic_cast<KBBGraphicsItem*>(m_items[i]))->isVisible());
0079         else
0080             return true;
0081     } else
0082         return false;
0083 }
0084 
0085 
0086 void KBBGraphicsItemSet::insert(KBBItemWithPosition* item)
0087 {
0088     if (contains(item->position()))
0089         // We want to avoid duplicated item on a given position.
0090         item->cleanDelete();
0091     else
0092         m_items.append(item);
0093 }
0094 
0095 
0096 KBBItemWithPosition* KBBGraphicsItemSet::item(int position)
0097 {
0098     KBBItemWithPosition* r = nullptr;
0099 
0100     for (int i=0;i<m_items.count();i++)
0101         if (m_items[i]->position()==position)
0102             r = m_items[i];
0103     return r;
0104 }
0105 
0106 
0107 void KBBGraphicsItemSet::remove(int position)
0108 {
0109     int i = indexOf(position);
0110 
0111     if (i!=NO_INDEX) {
0112         m_items[i]->cleanDelete();
0113         m_scene->update();
0114         m_items.removeAt(i);
0115     }
0116 }
0117 
0118 
0119 void KBBGraphicsItemSet::setVisible(const int position, const bool visible)
0120 {
0121     int i = indexOf(position);
0122 
0123     if (i!=NO_INDEX) {
0124         if(dynamic_cast<KBBGraphicsItem*>(m_items[i]))
0125             (dynamic_cast<KBBGraphicsItem*>(m_items[i]))->setVisible(visible);
0126     }
0127 }
0128 
0129 
0130 
0131 //
0132 // Private
0133 //
0134 
0135 int KBBGraphicsItemSet::indexOf(int position)
0136 {
0137     for(int i=0;i<m_items.count();i++)
0138         if (m_items[i]->position()==position)
0139             return i;
0140 
0141     return NO_INDEX;
0142 }