00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "qxtscheduleview.h"
00027 #include "qxtscheduleview_p.h"
00028 #include "qxtscheduleheaderwidget.h"
00029 #include "qxtscheduleviewheadermodel_p.h"
00030 #include <QPainter>
00031 #include <QScrollBar>
00032 #include <QBrush>
00033 #include <QMouseEvent>
00034 #include <QDebug>
00035 #include <QApplication>
00036 #include <QTimer>
00037 #include <QStringList>
00038 #include <QWidget>
00039 #include <QList>
00040 #include <QListIterator>
00041 #include <QWheelEvent>
00042
00043
00061 QxtScheduleView::QxtScheduleView(QWidget *parent)
00062 : QAbstractScrollArea(parent)
00063 {
00064 QXT_INIT_PRIVATE(QxtScheduleView);
00065
00066
00067 qxt_d().m_currentZoomDepth = 15 * 60;
00068 qxt_d().m_currentViewMode = DayView;
00069 qxt_d().m_startUnixTime = 0;
00070 qxt_d().m_endUnixTime = 0;
00071 qxt_d().delegate = qxt_d().defaultDelegate = new QxtScheduleItemDelegate(this);
00072
00073 qxt_d().m_vHeader = new QxtScheduleHeaderWidget(Qt::Vertical, this);
00074 connect(qxt_d().m_vHeader, SIGNAL(geometriesChanged()), this, SLOT(updateGeometries()));
00075 qxt_d().m_vHeader->hide();
00076
00077 qxt_d().m_hHeader = new QxtScheduleHeaderWidget(Qt::Horizontal, this);
00078 connect(qxt_d().m_hHeader, SIGNAL(geometriesChanged()), this, SLOT(updateGeometries()));
00079 qxt_d().m_hHeader->hide();
00080
00081 }
00082
00088 void QxtScheduleView::setModel(QAbstractItemModel *model)
00089 {
00090 if (qxt_d().m_Model)
00091 {
00092
00093 qDeleteAll(qxt_d().m_Items.begin(), qxt_d().m_Items.end());
00094 qxt_d().m_Items.clear();
00095
00096
00097 disconnect(qxt_d().m_Model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(dataChanged(const QModelIndex &, const QModelIndex &)));
00098 disconnect(qxt_d().m_Model, SIGNAL(rowsAboutToBeInserted(const QModelIndex &, int, int)), this, SLOT(rowsAboutToBeInserted(const QModelIndex &, int , int)));
00099 disconnect(qxt_d().m_Model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int , int)));
00100 disconnect(qxt_d().m_Model, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)), this, SLOT(rowsAboutToBeRemoved(const QModelIndex &, int , int)));
00101 disconnect(qxt_d().m_Model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(rowsRemoved(const QModelIndex &, int , int)));
00102
00103
00104 qxt_d().m_Model = 0;
00105 }
00106
00107 if (model != 0)
00108 {
00109
00110 qxt_d().m_Model = model;
00111 connect(model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(dataChanged(const QModelIndex &, const QModelIndex &)));
00112 connect(model, SIGNAL(rowsAboutToBeInserted(const QModelIndex &, int, int)), this, SLOT(rowsAboutToBeInserted(const QModelIndex &, int , int)));
00113 connect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int , int)));
00114 connect(model, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)), this, SLOT(rowsAboutToBeRemoved(const QModelIndex &, int , int)));
00115 connect(model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(rowsRemoved(const QModelIndex &, int , int)));
00116 }
00117 qxt_d().init();
00118 }
00119
00120 QAbstractItemModel * QxtScheduleView::model() const
00121 {
00122 return qxt_d().m_Model;
00123 }
00124
00136 void QxtScheduleView::setViewMode(const QxtScheduleView::ViewMode mode)
00137 {
00138 qxt_d().m_currentViewMode = mode;
00139
00140
00141
00142 setCurrentZoomDepth(qxt_d().m_currentZoomDepth);
00143 }
00144
00148 QxtScheduleItemDelegate* QxtScheduleView::delegate () const
00149 {
00150 return qxt_d().delegate;
00151 }
00152
00159 void QxtScheduleView::setItemDelegate (QxtScheduleItemDelegate * delegate)
00160 {
00161 if(!delegate)
00162 qxt_d().delegate = qxt_d().defaultDelegate;
00163 else
00164 qxt_d().delegate = delegate;
00165
00166
00167 viewport()->update();
00168 }
00169
00176 QxtScheduleView::ViewMode QxtScheduleView::viewMode() const
00177 {
00178 return (ViewMode)qxt_d().m_currentViewMode;
00179 }
00180
00192 void QxtScheduleView::setZoomStepWidth(const int zoomWidth , const Qxt::Timeunit unit)
00193 {
00194 switch (unit)
00195 {
00196 case Qxt::Second:
00197 {
00198 qxt_d().m_zoomStepWidth = zoomWidth;
00199 }
00200 break;
00201 case Qxt::Minute:
00202 {
00203 qxt_d().m_zoomStepWidth = zoomWidth * 60;
00204 }
00205 break;
00206 case Qxt::Hour:
00207 {
00208 qxt_d().m_zoomStepWidth = zoomWidth * 60 * 60;
00209 }
00210 break;
00211 default:
00212 qWarning() << "This Timeunit is not implemented yet you can use Second,Minute,Hour using standart 15 minutes";
00213 qxt_d().m_zoomStepWidth = 900;
00214 break;
00215 }
00216 }
00217
00230 void QxtScheduleView::setCurrentZoomDepth(const int depth , const Qxt::Timeunit unit)
00231 {
00232 int newZoomDepth = 900;
00233
00234
00235 if (depth == 0)
00236 return;
00237
00238 switch (unit)
00239 {
00240 case Qxt::Second:
00241 {
00242 newZoomDepth = depth;
00243 }
00244 break;
00245 case Qxt::Minute:
00246 {
00247 newZoomDepth = depth * 60;
00248 }
00249 break;
00250 case Qxt::Hour:
00251 {
00252 newZoomDepth = depth * 60 * 60;
00253 }
00254 break;
00255 default:
00256 qWarning() << "This Timeunit is not implemented yet you can use Second,Minute,Hour using standart 15 minutes";
00257 break;
00258 }
00259
00260
00261 int timePerCol = timePerColumn();
00262
00263 newZoomDepth = newZoomDepth > timePerCol ? timePerCol : newZoomDepth;
00264 newZoomDepth = newZoomDepth <= 0 ? 1 : newZoomDepth;
00265
00266 while (timePerCol % newZoomDepth)
00267 {
00268 if (depth > qxt_d().m_currentZoomDepth)
00269 {
00270 newZoomDepth++;
00271 if (newZoomDepth >= timePerCol)
00272 return;
00273 }
00274
00275 else
00276 {
00277 newZoomDepth--;
00278 if (newZoomDepth <= 1)
00279 return;
00280 }
00281 }
00282
00283 qDebug() << "Zoomed, old zoom depth: " << qxt_d().m_currentZoomDepth << " new zoom depth: " << newZoomDepth;
00284
00285 qxt_d().m_currentZoomDepth = newZoomDepth;
00286 emit this->newZoomDepth(newZoomDepth);
00287
00288
00289 if (model())
00290 {
00291 updateGeometries();
00292 qxt_d().reloadItemsFromModel();
00293 }
00294 }
00295
00299 int QxtScheduleView::currentZoomDepth(const Qxt::Timeunit unit)
00300 {
00301 switch (unit)
00302 {
00303 case Qxt::Second:
00304 {
00305 return qxt_d().m_currentZoomDepth;
00306 }
00307 break;
00308 case Qxt::Minute:
00309 {
00310 return qxt_d().m_currentZoomDepth / 60;
00311 }
00312 break;
00313 case Qxt::Hour:
00314 {
00315 return qxt_d().m_currentZoomDepth / 60 / 60;
00316 }
00317 break;
00318 default:
00319 qWarning() << "This Timeunit is not implemented yet you can use Second,Minute,Hour returning seconds";
00320 return qxt_d().m_currentZoomDepth;
00321 break;
00322 }
00323 }
00324
00330 void QxtScheduleView::zoomIn()
00331 {
00332 setCurrentZoomDepth(qxt_d().m_currentZoomDepth - qxt_d().m_zoomStepWidth);
00333 }
00334
00340 void QxtScheduleView::zoomOut()
00341 {
00342 setCurrentZoomDepth(qxt_d().m_currentZoomDepth + qxt_d().m_zoomStepWidth);
00343 }
00344
00345 void QxtScheduleView::paintEvent(QPaintEvent * )
00346 {
00347 if (model())
00348 {
00349
00350
00351 int iNumRows = qxt_d().m_vHeader->count();
00352 qDebug() << "Painting rows " << iNumRows;
00353
00354 int xRowEnd = qxt_d().m_hHeader->sectionViewportPosition(qxt_d().m_hHeader->count() - 1) + qxt_d().m_hHeader->sectionSize(qxt_d().m_hHeader->count() - 1);
00355 QPainter painter(viewport());
00356
00357
00358 painter.save();
00359 painter.setPen(QColor(220, 220, 220));
00360
00361 bool thinLine;
00362 thinLine = false;
00363 for (int iLoop = 0; iLoop < iNumRows; iLoop += 2)
00364 {
00365 painter.drawLine(0 , qxt_d().m_vHeader->sectionViewportPosition(iLoop), xRowEnd, qxt_d().m_vHeader->sectionViewportPosition(iLoop));
00366 }
00367
00368 int iNumCols = qxt_d().m_hHeader->count();
00369 int iYColEnd = qxt_d().m_vHeader->sectionViewportPosition(qxt_d().m_vHeader->count() - 1) + qxt_d().m_vHeader->sectionSize(qxt_d().m_vHeader->count() - 1);
00370
00371 for (int iLoop = 0; iLoop < iNumCols ; iLoop++)
00372 {
00373 painter.drawLine(qxt_d().m_hHeader->sectionViewportPosition(iLoop), 0, qxt_d().m_hHeader->sectionViewportPosition(iLoop), iYColEnd);
00374 }
00375
00376 painter.restore();
00377
00378 QListIterator<QxtScheduleInternalItem *> itemIterator(qxt_d().m_Items);
00379 while (itemIterator.hasNext())
00380 {
00381 QxtScheduleInternalItem * currItem = itemIterator.next();
00382 QxtStyleOptionScheduleViewItem style;
00383
00384
00385 style.roundCornersRadius = qxt_d().m_vHeader->sectionSize(1) / 2;
00386 style.itemHeaderHeight = qxt_d().m_vHeader->sectionSize(1);
00387 style.maxSubItemHeight = qxt_d().m_vHeader->sectionSize(1);
00388
00389 if (currItem->isDirty)
00390 currItem->m_cachedParts.clear();
00391
00392 style.itemGeometries = currItem->m_geometries;
00393 style.itemPaintCache = &currItem->m_cachedParts;
00394 style.translate = QPoint(-qxt_d().m_hHeader->offset(), -qxt_d().m_vHeader->offset());
00395 painter.save();
00396 qxt_d().delegate->paint(&painter, style, currItem->modelIndex());
00397 painter.restore();
00398 currItem->setDirty(false);
00399 }
00400
00401 painter.end();
00402 }
00403 }
00404
00405 void QxtScheduleView::updateGeometries()
00406 {
00407 this->setViewportMargins(qxt_d().m_vHeader->sizeHint().width() + 1, qxt_d().m_hHeader->sizeHint().height() + 1, 0, 0);
00408
00409
00410 verticalScrollBar()->setRange(0, qxt_d().m_vHeader->count()*qxt_d().m_vHeader->defaultSectionSize() - viewport()->height());
00411 verticalScrollBar()->setSingleStep(qxt_d().m_vHeader->defaultSectionSize());
00412 verticalScrollBar()->setPageStep(qxt_d().m_vHeader->defaultSectionSize());
00413
00414 int left = 2;
00415 int top = qxt_d().m_hHeader->sizeHint().height() + 2;
00416 int width = qxt_d().m_vHeader->sizeHint().width();
00417 int height = viewport()->height();
00418 qxt_d().m_vHeader->setGeometry(left, top, width, height);
00419
00420 left = left + width;
00421 top = 1;
00422 width = viewport()->width();
00423 height = qxt_d().m_hHeader->sizeHint().height();
00424
00425 qxt_d().m_hHeader->setGeometry(left, top, width, height);
00426 qxt_d().m_hHeader->setDefaultSectionSize(viewport()->width() / 5);
00427
00428 for (int iLoop = 0; iLoop < qxt_d().m_hHeader->count(); iLoop++)
00429 qxt_d().m_hHeader->resizeSection(iLoop, viewport()->width() / 5);
00430 qxt_d().m_hHeader->setResizeMode(QHeaderView::Fixed);
00431
00432
00433 horizontalScrollBar()->setRange(0, (qxt_d().m_hHeader->count() * qxt_d().m_hHeader->defaultSectionSize() - viewport()->width()));
00434 horizontalScrollBar()->setSingleStep(qxt_d().m_hHeader->defaultSectionSize());
00435 horizontalScrollBar()->setPageStep(qxt_d().m_hHeader->defaultSectionSize());
00436
00437
00438 qxt_d().m_vHeader->show();
00439 qxt_d().m_hHeader->show();
00440 qxt_d().handleItemConcurrency(0, this->rows() * this->cols() - 1);
00441 viewport()->update();
00442 }
00443
00444 void QxtScheduleView::scrollContentsBy(int dx, int dy)
00445 {
00446 qxt_d().m_vHeader->setOffset(qxt_d().m_vHeader->offset() - dy);
00447 qxt_d().m_hHeader->setOffset(qxt_d().m_hHeader->offset() - dx);
00448 QAbstractScrollArea::scrollContentsBy(dx, dy);
00449 }
00450
00451 void QxtScheduleView::mouseMoveEvent(QMouseEvent * e)
00452 {
00453 if (qxt_d().m_selectedItem)
00454 {
00455 int currentMousePosTableOffset = qxt_d().pointToOffset((e->pos()));
00456
00457 if (currentMousePosTableOffset != qxt_d().m_lastMousePosOffset)
00458 {
00459 if (currentMousePosTableOffset >= 0)
00460 {
00461
00462 int startTableOffset = qxt_d().m_selectedItem->visualStartTableOffset();
00463 int endTableOffset = -1;
00464
00465
00466 if (this->viewport()->cursor().shape() == Qt::SizeVerCursor)
00467 {
00468 QVector<QRect> geo = qxt_d().m_selectedItem->geometry();
00469 QRect rect = geo[geo.size()-1];
00470 endTableOffset = currentMousePosTableOffset;
00471 }
00472 else
00473 {
00474
00475
00476 int difference = currentMousePosTableOffset - qxt_d().m_lastMousePosOffset;
00477
00478
00479 startTableOffset = startTableOffset + difference;
00480 endTableOffset = startTableOffset + qxt_d().m_selectedItem->rows() - 1;
00481 }
00482 if (startTableOffset >= 0 && endTableOffset >= startTableOffset && endTableOffset < (rows()*cols()))
00483 {
00484 QVector< QRect > newGeometry = qxt_d().calculateRangeGeometries(startTableOffset, endTableOffset);
00485
00486 int oldStartOffset = qxt_d().m_selectedItem->visualStartTableOffset();
00487 int newStartOffset = qxt_d().m_selectedItem->visualEndTableOffset();
00488
00489 qxt_d().m_selectedItem->setGeometry(newGeometry);
00490 qxt_d().m_selectedItem->setDirty();
00491 qxt_d().m_lastMousePosOffset = currentMousePosTableOffset;
00492 #if 1
00493 if (newGeometry.size() > 0)
00494 {
00495 int start = qxt_d().m_selectedItem->visualStartTableOffset();
00496 int end = qxt_d().m_selectedItem->visualEndTableOffset();
00497 qxt_d().handleItemConcurrency(oldStartOffset, newStartOffset);
00498 qxt_d().handleItemConcurrency(start, end);
00499 }
00500 #endif
00501
00502 }
00503 }
00504 }
00505 return;
00506 }
00507 else
00508 {
00509
00510 QPoint translatedPos = mapFromViewport(e->pos());
00511 QxtScheduleInternalItem * it = qxt_d().internalItemAt(translatedPos);
00512 if (it)
00513 {
00514 QVector<QRect> geo = it->geometry();
00515 QRect rect = geo[geo.size()-1];
00516 if (rect.contains(translatedPos) && (translatedPos.y() >= rect.bottom() - 5 && translatedPos.y() <= rect.bottom()))
00517 {
00518 this->viewport()->setCursor(Qt::SizeVerCursor);
00519 return;
00520 }
00521 }
00522
00523 if (this->viewport()->cursor().shape() != Qt::ArrowCursor)
00524 this->viewport()->setCursor(Qt::ArrowCursor);
00525 }
00526 }
00527
00528 void QxtScheduleView::mouseDoubleClickEvent ( QMouseEvent * e )
00529 {
00530 qxt_d().m_currentItem = qxt_d().internalItemAt(mapFromViewport(e->pos()));
00531 if (qxt_d().m_currentItem)
00532 {
00533 emit indexDoubleClicked(qxt_d().m_currentItem->modelIndex());
00534 }
00535 }
00536
00537 void QxtScheduleView::mousePressEvent(QMouseEvent * e)
00538 {
00539 qxt_d().m_currentItem = qxt_d().internalItemAt(mapFromViewport(e->pos()));
00540
00541 if (qxt_d().m_currentItem)
00542 {
00543 emit indexSelected(qxt_d().m_currentItem->modelIndex());
00544 }
00545 else
00546 emit indexSelected(QModelIndex());
00547
00548 if (e->button() == Qt::RightButton)
00549 {
00550 if (qxt_d().m_currentItem)
00551 emit contextMenuRequested(qxt_d().m_currentItem->modelIndex());
00552 }
00553 else
00554 {
00555 qxt_d().m_lastMousePosOffset = qxt_d().pointToOffset(e->pos());
00556 if (qxt_d().m_lastMousePosOffset >= 0)
00557 {
00558 qxt_d().m_selectedItem = qxt_d().m_currentItem;
00559
00560
00561 if (qxt_d().m_selectedItem)
00562 {
00563 qDebug() << "Selected Item:" << qxt_d().m_selectedItem->m_iModelRow;
00564 raiseItem(qxt_d().m_selectedItem->modelIndex());
00565 qxt_d().m_selectedItem->startMove();
00566 qxt_d().scrollTimer.start(100);
00567 }
00568 else
00569 qxt_d().m_lastMousePosOffset = -1;
00570 }
00571 }
00572
00573
00574 }
00575
00576 void QxtScheduleView::mouseReleaseEvent(QMouseEvent * )
00577 {
00578 qxt_d().scrollTimer.stop();
00579 if (qxt_d().m_selectedItem)
00580 {
00581 int oldStartTableOffset = qxt_d().m_selectedItem->startTableOffset();
00582 int oldEndTableOffset = oldStartTableOffset + qxt_d().m_selectedItem->rows() - 1 ;
00583
00584
00585 QVector<QRect> geo = qxt_d().m_selectedItem->geometry();
00586 QRect rect = geo[geo.size()-1];
00587
00588 int newStartTableOffset = qxt_d().m_selectedItem->visualStartTableOffset();
00589 int newEndTableOffset = qxt_d().m_selectedItem->visualEndTableOffset();
00590
00591 qxt_d().m_selectedItem->stopMove();
00592
00593 QVariant newStartUnixTime;
00594 QVariant newDuration;
00595
00596 newStartUnixTime = qxt_d().offsetToUnixTime(newStartTableOffset);
00597 model()->setData(qxt_d().m_selectedItem->modelIndex(), newStartUnixTime, Qxt::ItemStartTimeRole);
00598 newDuration = qxt_d().offsetToUnixTime(newEndTableOffset, true) - newStartUnixTime.toInt();
00599 model()->setData(qxt_d().m_selectedItem->modelIndex(), newDuration, Qxt::ItemDurationRole);
00600
00601 qxt_d().m_selectedItem = NULL;
00602 qxt_d().m_lastMousePosOffset = -1;
00603
00604
00605 qxt_d().handleItemConcurrency(oldStartTableOffset, oldEndTableOffset);
00606
00607
00608
00609
00610 }
00611 }
00612
00613 void QxtScheduleView::wheelEvent(QWheelEvent * e)
00614 {
00615
00616 if (e->modifiers() & Qt::ControlModifier)
00617 {
00618 if (e->delta() < 0)
00619 zoomOut();
00620 else
00621 zoomIn();
00622
00623 }
00624 else
00625 QAbstractScrollArea::wheelEvent(e);
00626 }
00627
00631 int QxtScheduleView::rows() const
00632 {
00633 if (!model())
00634 return 0;
00635
00636 int timePerCol = timePerColumn();
00637
00638 Q_ASSERT(timePerCol % qxt_d().m_currentZoomDepth == 0);
00639 int iNeededRows = timePerCol / qxt_d().m_currentZoomDepth;
00640
00641 return iNeededRows;
00642
00643 }
00644
00648 int QxtScheduleView::cols() const
00649 {
00650 if (!model())
00651 return 0;
00652
00653 int cols = 0;
00654 int timeToShow = qxt_d().m_endUnixTime - qxt_d().m_startUnixTime + 1 ;
00655 int timePerCol = timePerColumn();
00656
00657 Q_ASSERT(timeToShow % timePerCol == 0);
00658 cols = (timeToShow / timePerCol);
00659
00660 return cols;
00661 }
00662
00667 int QxtScheduleView::timePerColumn() const
00668 {
00669 int timePerColumn = 0;
00670
00671 switch (qxt_d().m_currentViewMode)
00672 {
00673 case DayView:
00674 timePerColumn = 24 * 60 * 60;
00675 break;
00676 case HourView:
00677 timePerColumn = 60 * 60;
00678 break;
00679 case MinuteView:
00680 timePerColumn = 60;
00681 break;
00682 default:
00683 Q_ASSERT(false);
00684 }
00685
00686 return timePerColumn;
00687 }
00688
00694 void QxtScheduleView::adjustRangeToViewMode(QDateTime *startTime, QDateTime *endTime) const
00695 {
00696 switch (qxt_d().m_currentViewMode)
00697 {
00698 case DayView:
00699 startTime->setTime(QTime(0, 0));
00700 endTime ->setTime(QTime(23, 59, 59));
00701 break;
00702 case HourView:
00703 startTime->setTime(QTime(startTime->time().hour(), 0));
00704 endTime ->setTime(QTime(endTime->time().hour(), 59, 59));
00705 break;
00706 case MinuteView:
00707 startTime->setTime(QTime(startTime->time().hour(), startTime->time().minute(), 0));
00708 endTime ->setTime(QTime(endTime->time().hour(), endTime->time().minute(), 59));
00709 break;
00710 default:
00711 Q_ASSERT(false);
00712 }
00713 }
00714
00715 QPoint QxtScheduleView::mapFromViewport(const QPoint & point) const
00716 {
00717 return point + QPoint(qxt_d().m_hHeader->offset(), qxt_d().m_vHeader->offset());
00718 }
00719
00720 QPoint QxtScheduleView::mapToViewport(const QPoint & point) const
00721 {
00722 return point - QPoint(qxt_d().m_hHeader->offset(), qxt_d().m_vHeader->offset());
00723 }
00724
00728 void QxtScheduleView::raiseItem(const QModelIndex &index)
00729 {
00730 QxtScheduleInternalItem *item = qxt_d().itemForModelIndex(index);
00731 if (item)
00732 {
00733 int iItemIndex = -1;
00734 if ((iItemIndex = qxt_d().m_Items.indexOf(item)) >= 0)
00735 {
00736 qxt_d().m_Items.takeAt(iItemIndex);
00737 qxt_d().m_Items.append(item);
00738 viewport()->update();
00739 }
00740 }
00741 }
00742
00743 void QxtScheduleView::dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight)
00744 {
00745 for (int iLoop = topLeft.row(); iLoop <= bottomRight.row();iLoop++)
00746 {
00747 QModelIndex index = model()->index(iLoop, 0);
00748 QxtScheduleInternalItem * item = qxt_d().itemForModelIndex(index);
00749 if (item)
00750 {
00751 int startOffset = item->startTableOffset();
00752 int endIndex = item->startTableOffset() + item->rows() - 1;
00753
00754 if (item->m_geometries.count() > 0)
00755 {
00756 int oldStartOffset = qxt_d().pointToOffset(mapToViewport(item->m_geometries[0].topLeft()));
00757 int oldEndOffset = qxt_d().pointToOffset(mapToViewport(item->m_geometries[item->m_geometries.size()-1].bottomRight()));
00758 qxt_d().handleItemConcurrency(oldStartOffset, oldEndOffset);
00759 }
00760
00761
00762 item->setGeometry(qxt_d().calculateRangeGeometries(startOffset, endIndex));
00763
00764 item->setDirty();
00765
00766 qxt_d().handleItemConcurrency(startOffset, endIndex);
00767
00768
00769 viewport()->update();
00770 }
00771 }
00772 }
00773
00777 void QxtScheduleView::handleItemConcurrency(const QModelIndex &index)
00778 {
00779 QxtScheduleInternalItem *item = qxt_d().itemForModelIndex(index);
00780 if (item)
00781 qxt_d().handleItemConcurrency(item);
00782 }
00783
00784
00785 void QxtScheduleView::resizeEvent(QResizeEvent * )
00786 {
00787 updateGeometries();
00788 }
00789
00790
00791 void QxtScheduleView::rowsRemoved(const QModelIndex & parent, int start, int end)
00792 {
00796 return qxt_d().reloadItemsFromModel();
00797
00798 if (!parent.isValid())
00799 {
00800 for (int iLoop = 0; iLoop < qxt_d().m_Items.count();iLoop++)
00801 {
00802 QxtScheduleInternalItem *item = qxt_d().m_Items.at(iLoop);
00803 if (item)
00804 {
00805 if (item->m_iModelRow >= start && item->m_iModelRow <= end)
00806 {
00807 qxt_d().m_Items.takeAt(iLoop);
00808 if (item == qxt_d().m_currentItem)
00809 {
00810 qxt_d().m_currentItem = 0;
00811 emit indexSelected(QModelIndex());
00812 }
00813 delete item;
00814 continue;
00815 }
00816 if (item->m_iModelRow > end)
00817 {
00818 int iDifference = end - start + 1;
00819 item->m_iModelRow -= iDifference;
00820 }
00821 }
00822 }
00823 }
00824 }
00825
00826 void QxtScheduleView::rowsInserted(const QModelIndex & parent, int start, int end)
00827 {
00828
00829 if (!parent.isValid())
00830 {
00831 for (int iLoop = start; iLoop <= end;iLoop++)
00832 {
00833
00834 QxtScheduleInternalItem *currentItem = new QxtScheduleInternalItem(this, model()->index(iLoop, 0));
00835 qxt_d().m_Items.append(currentItem);
00836 connect(currentItem, SIGNAL(geometryChanged(QxtScheduleInternalItem*, QVector<QRect>)), &qxt_d(), SLOT(itemGeometryChanged(QxtScheduleInternalItem * , QVector< QRect >)));
00837 qxt_d().handleItemConcurrency(currentItem);
00838 }
00839 }
00840
00841 viewport()->update();
00842 }
00843
00844 void QxtScheduleView::rowsAboutToBeRemoved(const QModelIndex & parent, int start, int end)
00845 {
00846 Q_UNUSED(parent);
00847 Q_UNUSED(start);
00848 Q_UNUSED(end);
00849
00850 return;
00851 }
00852
00853 void QxtScheduleView::rowsAboutToBeInserted(const QModelIndex & parent, int start, int end)
00854 {
00855
00856 if (!parent.isValid())
00857 {
00858 int iDifference = end - start;
00859 for (int iLoop = 0; iLoop < qxt_d().m_Items.count();iLoop++)
00860 {
00861 QxtScheduleInternalItem * item = qxt_d().m_Items[iLoop];
00862 if (item)
00863 if (item->m_iModelRow >= start && item->m_iModelRow < model()->rowCount())
00864 item->m_iModelRow += iDifference + 1;
00865 }
00866 }
00867 }
00868
00872 QModelIndex QxtScheduleView::currentIndex()
00873 {
00874 QModelIndex currIndex;
00875 if (qxt_d().m_currentItem)
00876 currIndex = qxt_d().m_currentItem->modelIndex();
00877 return currIndex;
00878
00879 }
00880
00885 void QxtScheduleView::setDateRange(const QDate & fromDate, const QDate & toDate)
00886 {
00887 Q_UNUSED(fromDate);
00888 Q_UNUSED(toDate);
00889
00890 QDateTime startTime = QDateTime(fromDate, QTime(0, 0, 0));
00891 QDateTime endTime = QDateTime(toDate, QTime(23, 59, 59));
00892 setTimeRange(startTime, endTime);
00893 }
00894
00900 void QxtScheduleView::setTimeRange(const QDateTime & fromDateTime, const QDateTime & toDateTime)
00901 {
00902 QDateTime startTime = fromDateTime;
00903 QDateTime endTime = toDateTime;
00904
00905
00906 adjustRangeToViewMode(&startTime, &endTime);
00907 qxt_d().m_startUnixTime = startTime.toTime_t();
00908 qxt_d().m_endUnixTime = endTime.toTime_t();
00909 }
00910
00911
00912
00913