SVN commit 947625 by astromme: Attempt at a QGraphicsWidget based task view M +4 -1 CMakeLists.txt A listwidget.cpp [License: LGPL (v2+)] A listwidget.h [License: LGPL (v2+)] M +78 -21 structure-plasmoid.cpp M +18 -0 structure-plasmoid.h M +1 -0 taskeditor.cpp M +1 -1 taskitem.h M +26 -2 taskitemdelegate.cpp M +7 -0 taskitemdelegate.h A tasklistwidget.cpp [License: UNKNOWN] A tasklistwidget.h [License: UNKNOWN] M +6 -5 taskmodel.cpp M +1 -1 taskmodel.h A taskwidget.cpp [License: LGPL (v2+)] A taskwidget.h [License: LGPL (v2)] --- trunk/playground/base/plasma/applets/rememberthemilk-kinetic/CMakeLists.txt #947624:947625 @@ -15,12 +15,15 @@ ) set(rememberthemilk-plasmoid_SRCS + listwidget.cpp + tasklistwidget.cpp structure-plasmoid.cpp taskitem.cpp taskitemdelegate.cpp taskeditor.cpp taskmodel.cpp - tasksortfilter.cpp) + tasksortfilter.cpp + taskwidget.cpp) set(rememberthemilk-testview_SRCS rememberthemilk-testview.cpp --- trunk/playground/base/plasma/applets/rememberthemilk-kinetic/structure-plasmoid.cpp #947624:947625 @@ -59,6 +59,11 @@ #include "taskitem.h" #include "taskmodel.h" #include "tasksortfilter.h" +#include +#include +#include "taskwidget.h" +#include "tasklistwidget.h" + StructurePlasmoid::StructurePlasmoid(QObject *parent, const QVariantList &args) : Plasma::PopupApplet(parent, args), @@ -157,12 +162,14 @@ void StructurePlasmoid::showTaskEditor(QModelIndex index) { if (!index.parent().isValid()) // We have a header rather than a task. return; - m_taskEditor->setModelIndex(index); - m_taskEditor->hide(); - m_taskEditor->show(); - m_tasksView->nativeWidget()->setEnabled(false); - m_taskEditor->setEnabled(true); - m_taskEditor->startAnimation(m_tasksView->size()); +// m_taskEditor->setModelIndex(index); +// m_taskEditor->hide(); +// m_taskEditor->show(); +// m_tasksView->nativeWidget()->setEnabled(false); +// m_taskEditor->setEnabled(true); +// m_taskEditor->startAnimation(m_tasksView->size()); + closeTaskAnimation(m_openingTask); + openTaskAnimation(index); m_priorityLabel->setText(i18n("Editing Task: ") + index.data(Qt::RTMTaskRole).value().getName()); geometryChanged(); @@ -200,14 +207,16 @@ if (source == "Lists" || source == "DummyLists") { while (m_categoriesBar->count() != 0) - m_categoriesBar->removeTab(0); + m_categoriesBar->removeTab(0); m_model->clearLists(); foreach(QString listId, data.keys()) { - m_categoriesBar->addTab(data.value(listId).value()); - m_model->addList(listId.toLong()); + m_categoriesBar->addTab(data.value(listId).value()); + m_model->addList(listId.toLong()); + m_list->insertList(listId.toLong()); } + m_engine->connectSource("DummyTasks", this); m_engine->connectSource("Tasks", this); // Set update interval? //updateData(); @@ -215,18 +224,20 @@ } else if (source == "Tasks" || source == "DummyTasks") { m_model->clear(); foreach(QVariant variant, data.values()) { - RTM::Task task = variant.value(); - m_model->addTask(task); + RTM::Task task = variant.value(); + m_model->addTask(task); + m_list->insertTask(task); } + if (m_model->getLists()->isEmpty()) // We must wait for the lists. - return; + return; else - updateData(); + updateData(); } else if (source.startsWith("Error")) { QString desc = data["description"].toString(); - kDebug() << desc; + kDebug() << desc; if (desc == "Authentication required"){ - //setAuthRequired(true); //TODO Fix when token is invalid. + //setAuthRequired(true); //TODO Fix when token is invalid. } } //updateGeometry(); @@ -239,6 +250,49 @@ } + +void StructurePlasmoid::openTaskAnimation(QModelIndex& index) { + m_openingTask = index; + m_delegate->setOpeningTaskHeight(m_openingTask, 0); + Plasma::Animator::self()->customAnimation(10, 100, Plasma::Animator::EaseInCurve, this, "openTaskAnimationStep"); +} + +void StructurePlasmoid::openTaskAnimationStep(qreal value) { + if (value == 1.0) { + openTaskAnimationFinished(); + return; + } + m_delegate->setOpeningTaskHeight(m_openingTask, 100*value); + m_tasksView->update(); +} + +void StructurePlasmoid::openTaskAnimationFinished() { + + m_delegate->setOpeningTaskHeight(m_openingTask, 100); + m_tasksView->update(); +} + +void StructurePlasmoid::closeTaskAnimation(QPersistentModelIndex& index) { + m_closingTask = index; + m_delegate->setClosingTaskHeight(m_closingTask, 100); + Plasma::Animator::self()->customAnimation(10, 100, Plasma::Animator::EaseOutCurve, this, "closeTaskAnimationStep"); +} + +void StructurePlasmoid::closeTaskAnimationStep(qreal value) { + if (value == 1.0) { + closeTaskAnimationFinished(); + return; + } + m_delegate->setClosingTaskHeight(m_closingTask, 100*(1-value)); + m_tasksView->update(); +} + +void StructurePlasmoid::closeTaskAnimationFinished() { + m_delegate->setClosingTaskHeight(m_closingTask, 0); + m_tasksView->update(); +} + + QGraphicsWidget* StructurePlasmoid::graphicsWidget() { if (m_graphicsWidget) return m_graphicsWidget; @@ -260,7 +314,7 @@ palette.setBrush(QPalette::Text, Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor)); - TaskItemDelegate *delegate = new TaskItemDelegate(this); + m_delegate = new TaskItemDelegate(this); m_filterModel = new TaskSortFilter(this); m_filterModel->setDynamicSortFilter(true); @@ -268,9 +322,9 @@ m_filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); m_tasksView = new Plasma::TreeView(this); - m_tasksView->installEventFilter(delegate); + m_tasksView->nativeWidget()->installEventFilter(m_delegate); m_tasksView->setModel(m_filterModel); - m_tasksView->nativeWidget()->setItemDelegate(delegate); + m_tasksView->nativeWidget()->setItemDelegate(m_delegate); m_tasksView->nativeWidget()->header()->setHidden(true); m_tasksView->nativeWidget()->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); m_tasksView->nativeWidget()->setRootIsDecorated(false); @@ -281,8 +335,8 @@ m_tasksView->nativeWidget()->setSelectionMode(QAbstractItemView::SingleSelection); m_tasksView->nativeWidget()->setDragEnabled(true); m_tasksView->nativeWidget()->setAcceptDrops(true); - m_tasksView->nativeWidget()->viewport()->setAcceptDrops(true); - m_tasksView->nativeWidget()->setDropIndicatorShown(false); + //m_tasksView->nativeWidget()->viewport()->setAcceptDrops(true); + m_tasksView->nativeWidget()->setDropIndicatorShown(true); m_tasksView->nativeWidget()->setDragDropMode(QAbstractItemView::DragDrop); //m_tasksView->nativeWidget()->setDropIndicatorShown(true); @@ -309,14 +363,17 @@ m_mainLayout = new QGraphicsLinearLayout(Qt::Vertical, m_graphicsWidget); + m_list = new TaskListWidget(this); + connect(m_categoriesBar, SIGNAL(currentChanged(int)), m_list, SLOT(animateToColumn(int))); + m_mainLayout->addItem(m_priorityLabel); m_mainLayout->addItem(m_categoriesBar); m_mainLayout->addItem(m_searchLine); + m_mainLayout->addItem(m_list); m_mainLayout->addItem(m_tasksView); //m_mainLayout->addItem(m_taskEditor); m_mainLayout->addItem(m_addTaskLine); - m_graphicsWidget->setLayout(m_mainLayout); m_graphicsWidget->setMinimumSize(250, 300); m_graphicsWidget->setPreferredSize(300, 500); --- trunk/playground/base/plasma/applets/rememberthemilk-kinetic/structure-plasmoid.h #947624:947625 @@ -49,12 +49,15 @@ class Label; class LineEdit; class TreeView; + class KineticArea; } class QSizeF; class QSortFilterProxyModel; class TaskModel; class TaskSortFilter; +class TaskWidget; +class TaskListWidget; class StructurePlasmoid : public Plasma::PopupApplet { @@ -75,6 +78,14 @@ void showTaskEditor(QModelIndex index); void onTaskEditorHide(); + void openTaskAnimation(QModelIndex& index); + void openTaskAnimationStep(qreal value); + void openTaskAnimationFinished(); + + void closeTaskAnimation(QPersistentModelIndex& index); + void closeTaskAnimationStep(qreal value); + void closeTaskAnimationFinished(); + public slots: void createConfigurationInterface(KConfigDialog *parent); void configAccepted(); @@ -95,6 +106,13 @@ Plasma::LineEdit *m_searchLine; TaskSortFilter *m_filterModel; RTM::Session *session; + + bool openingTask; + TaskItemDelegate* m_delegate; + QPersistentModelIndex m_openingTask; + QPersistentModelIndex m_closingTask; + TaskListWidget* m_list; + Plasma::KineticArea *m_scrollWidget; }; // This links the .desktop file to the applet --- trunk/playground/base/plasma/applets/rememberthemilk-kinetic/taskeditor.cpp #947624:947625 @@ -216,6 +216,7 @@ opacity = (1-value)*.9; + setOpacity(value); // Old code for sliding/resizing in from the right. Not working because of minimumSize issues. /* if (value > .3 && appearing) { --- trunk/playground/base/plasma/applets/rememberthemilk-kinetic/taskitem.h #947624:947625 @@ -27,7 +27,7 @@ namespace Qt { - enum ItemUserDataRole { SortRole = 64, IdRole = 65, RTMTaskRole = 66, RTMPriorityRole = 67 }; + enum ItemUserDataRole { SortRole = 64, IdRole = 65, RTMTaskRole = 66, RTMPriorityRole = 67, HeightRole=68 }; }; class TaskItem : public QStandardItem --- trunk/playground/base/plasma/applets/rememberthemilk-kinetic/taskitemdelegate.cpp #947624:947625 @@ -51,7 +51,8 @@ dragging = true; if (event->type() == QEvent::Drop || QEvent::DragLeave) dragging = false; - return QStyledItemDelegate::eventFilter(object, event); + return false; + //return QStyledItemDelegate::eventFilter(object, event); } @@ -85,6 +86,11 @@ painter->setBrush(gradient); painter->drawRect(option.rect); +// if (index.data(Qt::SelectedRole).toBool()) { +// +// +// } + if (!index.parent().isValid()) { //Priority header QString priority = index.data(Qt::DisplayRole).toString(); painter->restore(); @@ -171,6 +177,19 @@ //TODO: Create overlay when dragging. } +void TaskItemDelegate::setOpeningTaskHeight(QPersistentModelIndex& index, int height) { + m_openingTaskHeight = height; + m_openingTask = index; + sizeHintChanged(index); +} + +void TaskItemDelegate::setClosingTaskHeight(QPersistentModelIndex& index, int height) { + m_closingTaskHeight = height; + m_closingTask = index; + sizeHintChanged(index); +} + + QSize TaskItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { @@ -196,7 +215,12 @@ //QSize size = QStyledItemDelegate::sizeHint(option, index); QSize size; - size.setHeight(MARGINH + MARGINH + QApplication::fontMetrics().height()*2); + if (index == m_openingTask) + size.setHeight(MARGINH + MARGINH + QApplication::fontMetrics().height()*2 + m_openingTaskHeight); + else if (index == m_closingTask) + size.setHeight(MARGINH + MARGINH + QApplication::fontMetrics().height()*2 + m_closingTaskHeight); + else + size.setHeight(MARGINH + MARGINH + QApplication::fontMetrics().height()*2); size.setWidth(MARGIN + MARGIN + QApplication::fontMetrics().width(task+due)); return size; } --- trunk/playground/base/plasma/applets/rememberthemilk-kinetic/taskitemdelegate.h #947624:947625 @@ -39,6 +39,9 @@ virtual bool eventFilter(QObject* object, QEvent* event); + void setOpeningTaskHeight(QPersistentModelIndex& index, int height); + void setClosingTaskHeight(QPersistentModelIndex& index, int height); + static const qreal CONFIG_ICON_WIDTH; static const qreal SINGLE_TRACK_ALBUM_WIDTH; static const qreal MARGIN; @@ -49,6 +52,10 @@ protected: bool dragging; + int m_closingTaskHeight; + QPersistentModelIndex m_closingTask; + int m_openingTaskHeight; + QPersistentModelIndex m_openingTask; }; #endif // TASKITEMDELEGATE_H --- trunk/playground/base/plasma/applets/rememberthemilk-kinetic/taskmodel.cpp #947624:947625 @@ -61,7 +61,7 @@ } } QFlags< Qt::DropAction > TaskModel::supportedDropActions() const { - //qDebug() << "TaskModel::supportedDropActions()"; + kDebug(); return Qt::MoveAction; } @@ -75,8 +75,9 @@ } QStringList TaskModel::mimeTypes() const { - QStringList types; + QStringList types = QAbstractItemModel::mimeTypes(); types << "application/vnd.text.list"; + kDebug() << types; return types; } @@ -182,7 +183,7 @@ } -void TaskModel::insertTask(RTM::Task task) +void TaskModel::insertTask(RTM::Task task, int height) { if (!task.getCompleted().isValid() && m_listIds->at(currentListIndex) == task.getListId()) { QStringList taskInfo; @@ -202,7 +203,7 @@ } else taskInfo << "No Tags"; - + //kDebug() << "Task Appended" << task.name; TaskItem *item = new TaskItem(); QVariant var; @@ -216,6 +217,7 @@ item->setData(INT_MAX, Qt::SortRole); item->setData(task.getPriority(), Qt::RTMPriorityRole); item->setData((qint64) task.getId(), Qt::IdRole); + item->setData(height, Qt::HeightRole); m_priorityItems.at(task.getPriority()-1)->insertRow(m_priorityItems.at(task.getPriority()-1)->rowCount(), item); } sort(); @@ -227,7 +229,6 @@ return true; } - TaskModel::~TaskModel() { delete m_listIds; delete m_tasks; --- trunk/playground/base/plasma/applets/rememberthemilk-kinetic/taskmodel.h #947624:947625 @@ -53,7 +53,7 @@ protected: void refreshToplevel(); void sort(); - void insertTask(RTM::Task task); + void insertTask(RTM::Task task, int height=0); QMap *m_tasks; QList *m_listIds; int currentListIndex;