• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdenetwork API Reference
  • KDE Home
  • Contact Us
 

kget

  • sources
  • kde-4.12
  • kdenetwork
  • kget
  • ui
transfersview.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE project
2 
3  Copyright (C) 2006 Dario Massarin <nekkar@libero.it>
4  Copyright (C) 2009 Lukas Appelhans <l.appelhans@gmx.de>
5 
6  This program is free software; you can redistribute it and/or
7  modify it under the terms of the GNU General Public
8  License as published by the Free Software Foundation; either
9  version 2 of the License, or (at your option) any later version.
10 */
11 
12 #include "transfersview.h"
13 #include "settings.h"
14 #include "transfersviewdelegate.h"
15 #include "transferdetails.h"
16 #include "core/transfertreemodel.h"
17 #include "core/kget.h"
18 
19 #include <KDebug>
20 #include <KAction>
21 #include <KLocale>
22 #include <KMenu>
23 #include <KRun>
24 
25 #include <QDropEvent>
26 #include <QHeaderView>
27 #include <QSignalMapper>
28 #include <QHBoxLayout>
29 #include <QGroupBox>
30 
31 TransfersView::TransfersView(QWidget * parent)
32  : QTreeView(parent)
33 {
34 // setItemsExpandable(false);
35  setRootIsDecorated(false);
36  setAnimated(true);
37  setAllColumnsShowFocus(true);
38  header()->setDefaultAlignment(Qt::AlignCenter);
39  header()->setMinimumSectionSize(80);
40  header()->setContextMenuPolicy(Qt::CustomContextMenu);
41  header()->setClickable(true);
42  m_headerMenu = new KMenu(header());
43 
44  setSelectionMode(QAbstractItemView::ExtendedSelection);
45  setDragEnabled(true);
46  setAcceptDrops(true);
47  setDropIndicatorShown(true);
48  setEditTriggers(QAbstractItemView::NoEditTriggers);
49  setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
50  setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
51 
52  connect(header(), SIGNAL(customContextMenuRequested(QPoint)),
53  SLOT(slotShowHeaderMenu(QPoint)));
54  connect(header(), SIGNAL(sectionCountChanged(int,int)), this, SLOT(populateHeaderActions()));
55  connect(header(), SIGNAL(sectionMoved(int,int,int)), this, SLOT(slotSectionMoved(int,int,int)));
56  connect(header(), SIGNAL(sectionResized(int,int,int)), this, SLOT(slotSaveHeader()));
57  connect(this, SIGNAL(doubleClicked(QModelIndex)),
58  this, SLOT(slotItemActivated(QModelIndex)));
59  connect(this, SIGNAL(collapsed(QModelIndex)),
60  this, SLOT(slotItemCollapsed(QModelIndex)));
61  connect(KGet::model(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
62  this, SLOT(closeExpandableDetails(QModelIndex,int,int)));
63 }
64 
65 TransfersView::~TransfersView()
66 {
67 }
68 
69 void TransfersView::setModel(QAbstractItemModel * model)
70 {
71  QTreeView::setModel(model);
72  int nGroups = model->rowCount(QModelIndex());
73 
74  for(int i = 0; i < nGroups; i++)
75  {
76  kDebug(5001) << "openEditor for row " << i;
77  openPersistentEditor(model->index(i, TransferTreeModel::Status, QModelIndex()));
78  }
79 
80  QByteArray loadedState = QByteArray::fromBase64(Settings::headerState().toAscii());
81  if (loadedState.isEmpty()) {
82  setColumnWidth(0 , 230);
83  } else {
84  header()->restoreState(loadedState);
85  }
86 
87  //Workaround if the saved headerState is corrupted
88  header()->setRootIndex(QModelIndex());
89 
90  populateHeaderActions();
91  toggleMainGroup();
92  connect(model, SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT (toggleMainGroup()));
93 }
94 
95 void TransfersView::dropEvent(QDropEvent * event)
96 {
97  QModelIndex dropIndex = indexAt(event->pos());
98  QTreeView::dropEvent(event);
99 
100  setExpanded(dropIndex, true);
101 }
102 
103 void TransfersView::rowsInserted(const QModelIndex & parent, int start, int end)
104 {
105  kDebug(5001) << "TransfersView::rowsInserted";
106 
107  if(!parent.isValid())
108  {
109  kDebug(5001) << "parent is not valid " << start << " " << end;
110 
111  for(int i = start; i <= end; i++)
112  {
113  kDebug(5001) << "openEditor for row " << i;
114  openPersistentEditor(model()->index(i, TransferTreeModel::Status, parent));
115  }
116  }
117 
118  QTreeView::rowsInserted(parent, start, end);
119 
120  setExpanded(parent, true);
121  toggleMainGroup();
122 }
123 
124 void TransfersView::populateHeaderActions()
125 {
126  m_headerMenu->clear();
127  m_headerMenu->addTitle(i18n("Select columns"));
128 
129  QSignalMapper *columnMapper = new QSignalMapper(this);
130  connect(columnMapper, SIGNAL(mapped(int)), SLOT(slotHideSection(int)));
131 
132  //Create for each column an action with the column-header as name
133  QVector<KAction*> orderedMenuItems(header()->count());
134  for (int i = 0; i < header()->count(); ++i) {
135  KAction *action = new KAction(this);
136  action->setText(model()->headerData(i, Qt::Horizontal).toString());
137  action->setCheckable(true);
138  action->setChecked(!header()->isSectionHidden(i));
139  orderedMenuItems[header()->visualIndex(i)] = action;
140 
141  connect(action, SIGNAL(toggled(bool)), columnMapper, SLOT(map()));
142  columnMapper->setMapping(action, i);
143  }
144 
145  //append the sorted actions
146  for (int i = 0; i < orderedMenuItems.count(); ++i) {
147  m_headerMenu->addAction(orderedMenuItems[i]);
148  }
149 }
150 
151 void TransfersView::slotHideSection(int logicalIndex)
152 {
153  const bool hide = !header()->isSectionHidden(logicalIndex);
154  header()->setSectionHidden(logicalIndex, hide);
155  slotSaveHeader();
156 }
157 
158 void TransfersView::slotSectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex)
159 {
160  Q_UNUSED(logicalIndex)
161 
162  //first item is the title, so increase the indexes by one
163  ++oldVisualIndex;
164  ++newVisualIndex;
165  QList<QAction*> actions = m_headerMenu->actions();
166 
167  QAction *before = actions.last();
168  if (newVisualIndex + 1 < actions.count()) {
169  if (newVisualIndex > oldVisualIndex) {
170  before = actions[newVisualIndex + 1];
171  } else {
172  before = actions[newVisualIndex];
173  }
174  }
175 
176  QAction *action = actions[oldVisualIndex];
177  m_headerMenu->removeAction(action);
178  m_headerMenu->insertAction(before, action);
179  slotSaveHeader();
180 }
181 
182 void TransfersView::slotSaveHeader()
183 {
184  Settings::setHeaderState(header()->saveState().toBase64());
185  Settings::self()->writeConfig();
186 }
187 
188 void TransfersView::dragMoveEvent ( QDragMoveEvent * event )
189 {
190  Q_UNUSED(event)
191 
192  closeExpandableDetails();
193  QTreeView::dragMoveEvent(event);
194 }
195 
196 void TransfersView::slotItemActivated(const QModelIndex & index)
197 {
198  if (!index.isValid())
199  return;
200 
201  TransferTreeModel * transferTreeModel = KGet::model();
202  ModelItem * item = transferTreeModel->itemFromIndex(index);
203  TransfersViewDelegate *view_delegate = static_cast <TransfersViewDelegate *> (itemDelegate());
204 
205  if(!item)
206  return;
207 
208  if(!item->isGroup() && index.column() == 0) {
209  if(!view_delegate->isExtended(index)) {
210  TransferHandler *handler = item->asTransfer()->transferHandler();
211  QWidget *widget = getDetailsWidgetForTransfer(handler);
212 
213  m_editingIndexes.append(index);
214  view_delegate->extendItem(widget, index);
215  }
216  else {
217  m_editingIndexes.removeAll(index);
218  view_delegate->contractItem(index);
219  }
220  KGet::actionCollection()->action("transfer_show_details")->setChecked(view_delegate->isExtended(index));
221  } else if (!item->isGroup() && static_cast<TransferModelItem*>(item)->transferHandler()->status() == Job::Finished) {
222  new KRun(static_cast<TransferModelItem*>(item)->transferHandler()->dest(), this);
223  }
224 }
225 
226 void TransfersView::slotItemCollapsed(const QModelIndex & index)
227 {
228  if (!index.isValid())
229  return;
230 
231  TransferTreeModel * transferTreeModel = KGet::model();
232  ModelItem * item = transferTreeModel->itemFromIndex(index);
233  TransfersViewDelegate *view_delegate = static_cast <TransfersViewDelegate *> (itemDelegate());
234 
235  if(!item)
236  return;
237 
238  if(item->isGroup()) {
239  TransferGroupHandler * groupHandler = item->asGroup()->groupHandler();
240  QList<TransferHandler *> transfers = groupHandler->transfers();
241 
242  foreach(TransferHandler * transfer, transfers) {
243  kDebug(5001) << "Transfer = " << transfer->source().prettyUrl();
244  view_delegate->contractItem(KGet::model()->itemFromTransferHandler(transfer)->index());
245  }
246  }
247 }
248 
249 void TransfersView::toggleMainGroup()
250 {
251  // show or hide the first group header if there's only one download group
252  int nGroups = model()->rowCount(QModelIndex());
253 
254  if(nGroups <= 1) {
255  setRootIndex(model()->index(0, 0, QModelIndex()));
256  }
257  else {
258  setRootIndex(QModelIndex());
259  }
260  header()->setRootIndex(QModelIndex());//HACK: else the header isn't visible with no visible items in the view
261 }
262 
263 void TransfersView::rowsAboutToBeRemoved(const QModelIndex & parent, int start, int end)
264 {
265  Q_UNUSED(parent)
266  Q_UNUSED(start)
267  Q_UNUSED(end)
268 
269  closeExpandableDetails(currentIndex());
270 }
271 
272 void TransfersView::slotShowHeaderMenu(const QPoint &point)
273 {
274  m_headerMenu->popup(header()->mapToGlobal(point));
275 }
276 
277 void TransfersView::closeExpandableDetails(const QModelIndex &transferIndex)
278 {
279  TransfersViewDelegate *view_delegate = static_cast <TransfersViewDelegate *> (itemDelegate());
280 
281  if(transferIndex.isValid()) {
282  view_delegate->contractItem(transferIndex);
283  m_editingIndexes.removeAll(transferIndex);
284  } else {
285  view_delegate->contractAll();
286  m_editingIndexes.clear();
287  }
288 }
289 
290 void TransfersView::selectionChanged(const QItemSelection & selected, const QItemSelection & deselected)
291 {
292  Q_UNUSED(deselected)
293  if (!selected.indexes().isEmpty()) {
294  TransfersViewDelegate *view_delegate = static_cast<TransfersViewDelegate *>(itemDelegate());
295  KGet::actionCollection()->action("transfer_show_details")->setChecked(view_delegate->isExtended(selected.indexes().first()));
296  }
297 
298  QTreeView::selectionChanged(selected, deselected);
299 }
300 
301 void TransfersView::closeExpandableDetails(const QModelIndex &parent, int rowStart, int rowEnd)
302 {
303  Q_UNUSED(parent)
304  Q_UNUSED(rowStart)
305  Q_UNUSED(rowEnd)
306 
307  TransfersViewDelegate *view_delegate = static_cast <TransfersViewDelegate *> (itemDelegate());
308 
309  view_delegate->contractAll();
310  m_editingIndexes.clear();
311 }
312 
313 QWidget *TransfersView::getDetailsWidgetForTransfer(TransferHandler *handler)
314 {
315  QGroupBox *groupBox = new QGroupBox(i18n("Transfer Details"));
316 
317  QVBoxLayout *layout = new QVBoxLayout(groupBox);
318  QWidget *detailsWidget = TransferDetails::detailsWidget(handler);
319  layout->addWidget(detailsWidget);
320 
321  return groupBox;
322 }
323 
324 #include "transfersview.moc"
TransferTreeModel::Status
Definition: transfertreemodel.h:120
TransferHandler
Class TransferHandler:
Definition: transferhandler.h:48
Job::Finished
The job is stopped, but this also indicates that it stopped because an error occurred.
Definition: job.h:47
TransfersView::closeExpandableDetails
void closeExpandableDetails(const QModelIndex &index=QModelIndex())
Definition: transfersview.cpp:277
TransferGroupHandler
Definition: transfergrouphandler.h:30
transfertreemodel.h
ModelItem::asGroup
GroupModelItem * asGroup()
Definition: transfertreemodel.cpp:74
TransfersView::setModel
void setModel(QAbstractItemModel *model)
Definition: transfersview.cpp:69
QWidget
TransfersViewDelegate
Definition: transfersviewdelegate.h:96
TransfersView::slotItemCollapsed
void slotItemCollapsed(const QModelIndex &index)
Definition: transfersview.cpp:226
transferdetails.h
TransfersView::dragMoveEvent
void dragMoveEvent(QDragMoveEvent *event)
Definition: transfersview.cpp:188
TransfersView::rowsAboutToBeRemoved
void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
Definition: transfersview.cpp:263
TransferTreeModel
Definition: transfertreemodel.h:108
Settings::self
static Settings * self()
Definition: settings.cpp:17
TransferTreeModel::itemFromIndex
ModelItem * itemFromIndex(const QModelIndex &index) const
Definition: transfertreemodel.cpp:391
TransferDetails::detailsWidget
static QWidget * detailsWidget(TransferHandler *transfer)
Definition: transferdetails.cpp:47
KGet::model
static TransferTreeModel * model()
Definition: kget.cpp:487
QTreeView
TransferHandler::source
const KUrl & source() const
Definition: transferhandler.h:93
KGet::actionCollection
static KActionCollection * actionCollection()
Definition: kget.cpp:631
GroupModelItem::groupHandler
TransferGroupHandler * groupHandler()
Definition: transfertreemodel.cpp:178
QAbstractItemModel
transfersview.h
ModelItem
Definition: transfertreemodel.h:59
TransfersView::slotItemActivated
void slotItemActivated(const QModelIndex &index)
Definition: transfersview.cpp:196
settings.h
TransferModelItem
Definition: transfertreemodel.h:77
TransferGroupHandler::transfers
const QList< TransferHandler * > transfers()
Definition: transfergrouphandler.cpp:134
kget.h
ModelItem::asTransfer
TransferModelItem * asTransfer()
Definition: transfertreemodel.cpp:79
transfersviewdelegate.h
Settings::setHeaderState
static void setHeaderState(const QString &v)
Set HeaderState.
Definition: settings.h:21
TransfersView::TransfersView
TransfersView(QWidget *parent=0)
Definition: transfersview.cpp:31
Settings::headerState
static QString headerState()
Get HeaderState.
Definition: settings.h:31
TransfersView::~TransfersView
~TransfersView()
Definition: transfersview.cpp:65
TransferModelItem::transferHandler
TransferHandler * transferHandler()
Definition: transfertreemodel.cpp:138
ModelItem::isGroup
virtual bool isGroup()
Definition: transfertreemodel.cpp:69
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:18 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kget

Skip menu "kget"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal