1 /* This file is part of the KDE project
3 Copyright (C) 2005 Dario Massarin <nekkar@libero.it>
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public
7 License as published by the Free Software Foundation; version 2
11 #include "core/transfergrouphandler.h"
13 #include "core/transferhandler.h"
14 #include "core/transfertreemodel.h"
15 #include "core/transfer.h"
16 #include "core/observer.h"
17 #include "core/kget.h"
22 #include <kactioncollection.h>
26 TransferGroupHandler::TransferGroupHandler(TransferGroup
* group
, Scheduler
* scheduler
)
28 m_scheduler(scheduler
),
33 TransferGroupHandler::~TransferGroupHandler()
37 void TransferGroupHandler::addObserver(TransferGroupObserver
* observer
)
39 kDebug(5001) << "TransferGroupHandler::addObserver";
40 m_observers
.push_back(observer
);
41 m_changesFlags
[observer
]=0xFFFFFFFF;
42 kDebug(5001) << " Now we have " << m_observers
.size() << " observers";
45 void TransferGroupHandler::delObserver(TransferGroupObserver
* observer
)
47 m_observers
.removeAll(observer
);
48 m_changesFlags
.remove(observer
);
51 void TransferGroupHandler::start()
53 kDebug(5001) << "TransferGroupHandler::start()";
54 m_group
->setStatus( JobQueue::Running
);
57 void TransferGroupHandler::stop()
59 kDebug(5001) << "TransferGroupHandler::stop()";
60 m_group
->setStatus( JobQueue::Stopped
);
63 void TransferGroupHandler::move(QList
<TransferHandler
*> transfers
, TransferHandler
* after
)
65 //Check that the given transfer (after) belongs to this group
66 if( after
&& (after
->group() != this) )
69 QList
<TransferHandler
*>::iterator it
= transfers
.begin();
70 QList
<TransferHandler
*>::iterator itEnd
= transfers
.end();
72 for( ; it
!=itEnd
; ++it
)
74 //Move the transfers in the JobQueue
76 m_group
->move( (*it
)->m_transfer
, after
->m_transfer
);
78 m_group
->move( (*it
)->m_transfer
, 0 );
84 TransferHandler
* TransferGroupHandler::operator[] (int i
)
86 // kDebug(5001) << "TransferGroupHandler::operator[" << i << "]";
88 return (*m_group
)[i
]->handler();
91 void TransferGroupHandler::setName(const QString
&name
)
93 m_group
->setName(name
);
94 postGroupChangedEvent();
97 QVariant
TransferGroupHandler::data(int column
)
99 // kDebug(5001) << "TransferGroupHandler::data(" << column << ")";
107 return i18np("1 Item", "%1 Items", m_group
->size());
110 /* if (totalSize() != 0)
111 return KIO::convertSize(totalSize());
113 return i18nc("not available", "n/a");*/
115 // return QString::number(percent())+'%'; // display progressbar instead
120 if (status() == JobQueue::Running
)
121 return i18n("Stalled");
126 return i18n("%1/s", KIO::convertSize(speed()));
132 TransferGroup::ChangesFlags
TransferGroupHandler::changesFlags(TransferGroupObserver
* observer
)
134 if( m_changesFlags
.find(observer
) != m_changesFlags
.end() )
135 return m_changesFlags
[observer
];
138 kDebug(5001) << " TransferGroupHandler::changesFlags() doesn't see you as an observer! ";
144 void TransferGroupHandler::resetChangesFlags(TransferGroupObserver
* observer
)
146 if( m_changesFlags
.find(observer
) != m_changesFlags
.end() )
147 m_changesFlags
[observer
] = 0;
149 kDebug(5001) << " TransferGroupHandler::resetchangesFlags() doesn't see you as an observer! ";
152 int TransferGroupHandler::indexOf(TransferHandler
* transfer
)
154 return m_group
->indexOf(transfer
->m_transfer
);
157 const QList
<TransferHandler
*> TransferGroupHandler::transfers()
159 QList
<TransferHandler
*> transfers
;
161 TransferGroup::iterator it
= m_group
->begin();
162 TransferGroup::iterator itEnd
= m_group
->end();
164 for( ; it
!=itEnd
; ++it
)
166 transfers
.append((static_cast<Transfer
*>(*it
))->handler());
171 const QList
<QAction
*> & TransferGroupHandler::actions()
178 KMenu
* TransferGroupHandler::popupMenu()
180 KMenu
* popup
= new KMenu( 0 );
181 // popup->addTitle( i18nc( "%1 is the name of the group", "%1 Group", name() ) );
185 popup
->addAction( KGet::actionCollection()->action("transfer_group_start") );
186 popup
->addAction( KGet::actionCollection()->action("transfer_group_stop") );
187 if(m_group
->name() != i18n("My Downloads")) {
188 popup
->addSeparator();
189 popup
->addAction( KGet::actionCollection()->action("delete_groups") );
190 popup
->addAction( KGet::actionCollection()->action("rename_groups") );
195 QObjectInterface
* TransferGroupHandler::qObject()
198 m_qobject
= new QObjectInterface(this);
203 void TransferGroupHandler::setGroupChange(ChangesFlags change
, bool postEvent
)
205 QMap
<TransferGroupObserver
*, ChangesFlags
>::Iterator it
= m_changesFlags
.begin();
206 QMap
<TransferGroupObserver
*, ChangesFlags
>::Iterator itEnd
= m_changesFlags
.end();
208 for( ; it
!=itEnd
; ++it
)
212 postGroupChangedEvent();
215 void TransferGroupHandler::postGroupChangedEvent()
217 //Here we have to copy the list and iterate on the copy itself, because
218 //a view can remove itself as a view while we are iterating over the
219 //observers list and this leads to crashes.
220 QList
<TransferGroupObserver
*> observers
= m_observers
;
222 QList
<TransferGroupObserver
*>::iterator it
= observers
.begin();
223 QList
<TransferGroupObserver
*>::iterator itEnd
= observers
.end();
225 for(; it
!=itEnd
; ++it
)
227 (*it
)->groupChangedEvent(this);
230 m_group
->model()->postDataChangedEvent(this);
233 void TransferGroupHandler::postAddedTransferEvent(Transfer
* transfer
, Transfer
* after
)
235 kDebug(5001) << "TransferGroupHandler::postAddedTransferEvent";
236 kDebug(5001) << " number of observers = " << m_observers
.size();
238 //Here we have to copy the list and iterate on the copy itself, because
239 //a view can remove itself as a view while we are iterating over the
240 //observers list and this leads to crashes.
241 QList
<TransferGroupObserver
*> observers
= m_observers
;
243 QList
<TransferGroupObserver
*>::iterator it
= observers
.begin();
244 QList
<TransferGroupObserver
*>::iterator itEnd
= observers
.end();
246 for(; it
!=itEnd
; ++it
)
249 (*it
)->addedTransferEvent(transfer
->handler(), after
->handler());
251 (*it
)->addedTransferEvent(transfer
->handler(), 0);
255 void TransferGroupHandler::postRemovedTransferEvent(Transfer
* transfer
)
257 //Here we have to copy the list and iterate on the copy itself, because
258 //a view can remove itself as a view while we are iterating over the
259 //observers list and this leads to crashes.
260 QList
<TransferGroupObserver
*> observers
= m_observers
;
262 QList
<TransferGroupObserver
*>::iterator it
= observers
.begin();
263 QList
<TransferGroupObserver
*>::iterator itEnd
= observers
.end();
265 for(; it
!=itEnd
; ++it
)
267 (*it
)->removedTransferEvent(transfer
->handler());
271 void TransferGroupHandler::postMovedTransferEvent(Transfer
* transfer
, Transfer
* after
)
273 //Here we have to copy the list and iterate on the copy itself, because
274 //a view can remove itself as a view while we are iterating over the
275 //observers list and this leads to crashes.
276 QList
<TransferGroupObserver
*> observers
= m_observers
;
278 QList
<TransferGroupObserver
*>::iterator it
= observers
.begin();
279 QList
<TransferGroupObserver
*>::iterator itEnd
= observers
.end();
281 for(; it
!=itEnd
; ++it
)
284 (*it
)->movedTransferEvent(transfer
->handler(), after
->handler());
286 (*it
)->movedTransferEvent(transfer
->handler(), 0);
290 void TransferGroupHandler::postDeleteEvent()
292 //Here we have to copy the list and iterate on the copy itself, because
293 //a view can remove itself as a view while we are iterating over the
294 //observers list and this leads to crashes.
295 QList
<TransferGroupObserver
*> observers
= m_observers
;
297 QList
<TransferGroupObserver
*>::iterator it
= observers
.begin();
298 QList
<TransferGroupObserver
*>::iterator itEnd
= observers
.end();
300 for(; it
!=itEnd
; ++it
)
302 (*it
)->deleteEvent(this);
306 void TransferGroupHandler::createActions()
308 if( !m_actions
.empty() )
311 //Calling this function we make sure the QObjectInterface object
312 //has been created (if not it will create it)
315 QAction
*startAction
= KGet::actionCollection()->addAction("transfer_group_start");
316 startAction
->setText(i18n("Start"));
317 startAction
->setIcon(KIcon("media-playback-start"));
318 QObject::connect(startAction
, SIGNAL(triggered()), qObject(), SLOT(slotStart()));
319 m_actions
.append(startAction
);
321 QAction
*stopAction
= KGet::actionCollection()->addAction("transfer_group_stop");
322 stopAction
->setText(i18n("Stop"));
323 stopAction
->setIcon(KIcon("media-playback-pause"));
324 QObject::connect(stopAction
, SIGNAL(triggered()), qObject(), SLOT(slotStop()));
325 m_actions
.append(stopAction
);
331 QObjectInterface::QObjectInterface(TransferGroupHandler
* handler
)
337 void QObjectInterface::slotStart()
342 void QObjectInterface::slotStop()
347 #include "transfergrouphandler.moc"