#include "taskeditor.h"
#include <QAbstractTableModel>
#include <QAction>
#include <QDebug>
#include <QHeaderView>
#include <QMenu>
#include <QSortFilterProxyModel>
#include <QTextEdit>
#include <QToolBar>
#include <QVBoxLayout>
#include "branchitem.h"
#include "mainwindow.h"
#include "task.h"
#include "taskmodel.h"
#include "vymmodel.h"
extern Main *mainWindow;
extern Settings settings;
extern QMenu* taskContextMenu;
extern TaskModel* taskModel;
TaskEditor::TaskEditor(QWidget *)
{
// Creat Table view
view = new QTableView;
QVBoxLayout* mainLayout = new QVBoxLayout;
QToolBar *tb=new QToolBar ("TaskEditor filters");
tb->setToolButtonStyle (Qt::ToolButtonTextBesideIcon);
mainLayout->addWidget (tb);
// Original icon from KDE: /usr/share/icons/oxygen/16x16/actions/view-filter.png
QIcon icon=QIcon (":/view-filter.png");
QAction *a = new QAction(icon, tr( "Current map","TaskEditor" ),this );
a->setCheckable(true);
a->setChecked (settings.value("/taskeditor/filterMap", false).toBool());
tb->addAction (a);
connect( a, SIGNAL( triggered() ), this, SLOT(toggleFilterMap() ) );
actionToggleFilterMap = a;
a = new QAction(icon, tr( "Active tasks","TaskEditor" ),this );
a->setCheckable(true);
a->setChecked (settings.value("/taskeditor/filterActive", false).toBool());
tb->addAction (a);
connect( a, SIGNAL( triggered() ), this, SLOT(toggleFilterActive() ) );
actionToggleFilterActive = a;
a = new QAction(icon, tr( "New tasks","TaskEditor" ),this );
a->setCheckable(true);
a->setChecked (settings.value("/taskeditor/filterNew", false).toBool());
tb->addAction (a);
connect( a, SIGNAL( triggered() ), this, SLOT(toggleFilterNew() ) );
actionToggleFilterNew = a;
a = new QAction(icon, "Flag", this); //tr( "Flags","TaskEditor" ),this ); // FIXME-1 add translation
a->setCheckable(true);
a->setChecked (settings.value("/taskeditor/filterNew", false).toBool());
if (settings.value( "/mainwindow/showTestMenu",false).toBool())
tb->addAction (a);
connect( a, SIGNAL( triggered() ), this, SLOT(toggleFilterFlags() ) );
actionToggleFilterFlags = a;
// Forward Enter and Return to MapEditor
a = new QAction(icon, tr( "Edit heading","TaskEditor" ), this);
a->setShortcut ( Qt::Key_Return);
a->setShortcutContext (Qt::WidgetWithChildrenShortcut);
addAction (a);
connect( a, SIGNAL( triggered() ), mainWindow, SLOT( editHeading() ) );
a = new QAction( tr( "Edit heading","TaskEditor" ), this);
a->setShortcut ( Qt::Key_Enter);
a->setShortcutContext (Qt::WidgetWithChildrenShortcut);
addAction (a);
connect( a, SIGNAL( triggered() ), mainWindow, SLOT( editHeading() ) );
// Clone actions defined in MainWindow
foreach (QAction* qa, mainWindow->taskEditorActions)
{
a = new QAction( this );
a->setShortcut( qa->shortcut() );
a->setShortcutContext (Qt::WidgetWithChildrenShortcut);
connect( a, SIGNAL( triggered() ), qa, SLOT( trigger() ) );
addAction(a);
}
mainLayout->addWidget (view);
setLayout (mainLayout);
view->setSelectionBehavior(QAbstractItemView::SelectRows);
view->horizontalHeader()->setStretchLastSection(true);
view->verticalHeader()->hide();
view->setEditTriggers(QAbstractItemView::NoEditTriggers);
filterActiveModel = new TaskFilterModel;
filterActiveModel->setSourceModel(taskModel);
view->setModel (filterActiveModel);
view->setSortingEnabled(true);
view->horizontalHeader()->setSortIndicator (0,Qt::AscendingOrder);
blockExternalSelect=false;
connect (
view->selectionModel(),SIGNAL (selectionChanged (QItemSelection,QItemSelection)),
this, SLOT (selectionChanged (QItemSelection,QItemSelection)));
// layout changes trigger resorting
connect( taskModel, SIGNAL( layoutChanged() ), this, SLOT(sort() ) );
// Enable wordwrap when data changes
connect (
taskModel, SIGNAL( dataChanged( QModelIndex, QModelIndex)),
view, SLOT( resizeRowsToContents() ) );
connect (
view->horizontalHeader(), SIGNAL( sectionResized(int, int, int)),
view, SLOT( resizeRowsToContents() ) );
// Initialize view filters according to previous settings
setFilterMap();
setFilterActive();
setFilterNew();
setFilterFlags();
// Initialize column widths
QString s;
for (int i=0; i<6; i++)
{
s=QString("/taskeditor/columnWidth/%1").arg(i);
if (settings.contains (s) )
view->setColumnWidth (i, settings.value(s, 100).toInt() );
}
// Initialize display of parents of a task
bool ok;
int i=settings.value ("/taskeditor/showParentsLevel", 0).toInt(&ok);
if (ok) taskModel->setShowParentsLevel(i);
}
TaskEditor::~TaskEditor()
{
settings.setValue ("/taskeditor/filterMap",actionToggleFilterMap->isChecked());
settings.setValue ("/taskeditor/filterActive",actionToggleFilterActive->isChecked());
settings.setValue ("/taskeditor/filterNew",actionToggleFilterNew->isChecked());
settings.setValue ("/taskeditor/showParentsLevel",taskModel->getShowParentsLevel() );
for (int i=0; i<7; i++)
settings.setValue (QString("/taskeditor/columnWidth/%1").arg(i),view->columnWidth(i) );
}
void TaskEditor::setMapName (const QString &n)
{
currentMapName=n;
setFilterMap();
}
bool TaskEditor::isUsedFilterMap()
{
return actionToggleFilterMap->isChecked();
}
void TaskEditor::setFilterMap ()
{
if (isUsedFilterMap() )
filterActiveModel->setMapFilter(currentMapName);
else
filterActiveModel->setMapFilter(QString() );
sort();
}
bool TaskEditor::isUsedFilterActive()
{
return actionToggleFilterActive->isChecked();
}
void TaskEditor::setFilterActive ()
{
filterActiveModel->setFilter (actionToggleFilterActive->isChecked() );
sort();
}
void TaskEditor::setFilterNew ()
{
filterActiveModel->setFilterNew (actionToggleFilterNew->isChecked() );
sort();
}
void TaskEditor::setFilterFlags () // FIXME-1 experimental
{
filterActiveModel->setFilterFlags (actionToggleFilterFlags->isChecked() );
sort();
}
void TaskEditor::showSelection()
{
QModelIndexList list=view->selectionModel()->selectedIndexes();
if (list.count()>0)
// Usually whole row is selected, so just go for first cell
view->scrollTo(taskModel->index(taskModel->getTask(list.first())), QAbstractItemView::EnsureVisible);
}
bool TaskEditor::select (Task *task)
{
if (task)
{
blockExternalSelect=true;
QModelIndex i0b=taskModel->index (task);
QModelIndex i0e=taskModel->indexRowEnd (task);
QModelIndex i1b=filterActiveModel->mapFromSource(i0b );
QModelIndex i1e=filterActiveModel->mapFromSource(i0e );
QItemSelection sel (i1b, i1e);
view->selectionModel()->select (sel, QItemSelectionModel::ClearAndSelect );
blockExternalSelect=false;
return true;
}
return false;
}
void TaskEditor::clearSelection()
{
view->selectionModel()->clearSelection();
}
void TaskEditor::selectionChanged ( const QItemSelection & selected, const QItemSelection & )
{// FIXME-3 what, if multiple selection in MapEditor?
// Avoid segfault on quit, when selected is empty
if (selected.indexes().isEmpty() ) return;
QItemSelection sel0=filterActiveModel->mapSelectionToSource (selected);
QModelIndex ix=sel0.indexes().first();
Task *t=taskModel->getTask (ix);
if (t)
{
BranchItem *bi=t->getBranch();
if (bi)
{
VymModel *m=bi->getModel();
if (!blockExternalSelect) m->select (bi);
if (m!=mainWindow->currentModel() )
mainWindow->gotoModel (m);
view->setStyleSheet(
QString ("selection-color: %1;"
"selection-background-color: %2;").arg(bi->getHeadingColor().name() ).arg(m->getSelectionColor().name() ) );
view->scrollTo (selected.indexes().first() );
}
}
}
void TaskEditor::contextMenuEvent ( QContextMenuEvent * e )
{
taskContextMenu->popup (e->globalPos() );
}
void TaskEditor::sort()
{
QHeaderView *hv=view->horizontalHeader();
view->sortByColumn( hv->sortIndicatorSection(), hv->sortIndicatorOrder() );
filterActiveModel->invalidate();
}
void TaskEditor::toggleFilterMap ()
{
setFilterMap ();
}
void TaskEditor::toggleFilterActive ()
{
setFilterActive();
}
void TaskEditor::toggleFilterNew ()
{
setFilterNew();
}
void TaskEditor::toggleFilterFlags ()
{
setFilterFlags();
}