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

ktimetracker

  • sources
  • kde-4.12
  • kdepim
  • ktimetracker
timetrackerwidget.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2007 by Mathias Soeken <msoeken@tzi.de>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the
16  * Free Software Foundation, Inc.
17  * 51 Franklin Street, Fifth Floor
18  * Boston, MA 02110-1301 USA.
19  *
20  */
21 
22 // TODO: what is the sense of tasksChanged()?
23 
24 #include "timetrackerwidget.h"
25 #include "ktimetrackerconfigdialog.h"
26 
27 #include <QDBusConnection>
28 #include <QFileInfo>
29 #include <QHBoxLayout>
30 #include <QKeyEvent>
31 #include <QKeySequence>
32 #include <QMap>
33 #include <QVBoxLayout>
34 #include <QVector>
35 
36 #include <KApplication>
37 #include <KAction>
38 #include <KActionCollection>
39 #include <KConfig>
40 #include <KConfigDialog>
41 #include <KDebug>
42 #include <KFileDialog>
43 #include <KGlobal>
44 #include <KIcon>
45 #include <KLocale>
46 #include <KMessageBox>
47 #include <KRecentFilesAction>
48 #include <KStandardAction>
49 #include <KTabWidget>
50 #include <KTemporaryFile>
51 #include <KTreeWidgetSearchLine>
52 #include <KUrl>
53 #include <KIO/Job>
54 
55 #include "historydialog.h"
56 #include "idletimedetector.h"
57 #include "ktimetrackerutility.h"
58 #include "ktimetracker.h"
59 #include "mainadaptor.h"
60 #include "reportcriteria.h"
61 #include "task.h"
62 #include "taskview.h"
63 #include "kdepim-version.h"
64 
65 
66 //@cond PRIVATE
67 class TimetrackerWidget::Private
68 {
69  public:
70  Private() :
71  mTaskView( 0 ) {}
72 
73  QWidget *mSearchLine;
74  KTreeWidgetSearchLine *mSearchWidget;
75  TaskView *mTaskView;
76  QMap<QString, KAction*> mActions;
77 
78  struct ActionData
79  {
80  QString iconName;
81  const char* caption;
82  const char* slot;
83  QString name;
84  const char* toolTip;
85  const char* whatsThis;
86  };
87 };
88 //@endcond
89 
90 TimetrackerWidget::TimetrackerWidget( QWidget *parent ) : QWidget( parent ),
91  d( new TimetrackerWidget::Private() )
92 {
93  kDebug(5970) << "Entering function";
94  new MainAdaptor( this );
95  QDBusConnection::sessionBus().registerObject( "/KTimeTracker", this );
96 
97  QLayout *layout = new QVBoxLayout;
98  layout->setMargin( 0 );
99  layout->setSpacing( 0 );
100 
101  QLayout *innerLayout = new QHBoxLayout;
102  d->mSearchLine = new QWidget( this );
103  innerLayout->setMargin( KDialog::marginHint() );
104  innerLayout->setSpacing( KDialog::spacingHint() );
105  d->mSearchWidget = new KTreeWidgetSearchLine( d->mSearchLine );
106  d->mSearchWidget->setClickMessage( i18n( "Search or add task" ) );
107  d->mSearchWidget->setWhatsThis( i18n( "This is a combined field. As long as you do not type ENTER, it acts as a filter. Then, only tasks that match your input are shown. As soon as you type ENTER, your input is used as name to create a new task." ) );
108  d->mSearchWidget->installEventFilter( this );
109  innerLayout->addWidget( d->mSearchWidget );
110  d->mSearchLine->setLayout( innerLayout );
111 
112  d->mTaskView = new TaskView( this );
113  layout->addWidget( d->mSearchLine );
114  layout->addWidget( d->mTaskView );
115  setLayout( layout );
116 
117  showSearchBar( !KTimeTrackerSettings::configPDA() && KTimeTrackerSettings::showSearchBar() );
118 }
119 
120 TimetrackerWidget::~TimetrackerWidget()
121 {
122  delete d;
123 }
124 
125 bool TimetrackerWidget::allEventsHaveEndTiMe()
126 {
127  return currentTaskView()->allEventsHaveEndTiMe();
128 }
129 
130 int TimetrackerWidget::focusSearchBar()
131 {
132  kDebug(5970) << "Entering function";
133  if ( d->mSearchWidget->isVisible() ) d->mSearchWidget->setFocus();
134  return 0;
135 }
136 
137 void TimetrackerWidget::addTaskView( const QString &fileName )
138 {
139  kDebug(5970) << "Entering function (fileName=" << fileName << ")";
140  bool isNew = fileName.isEmpty();
141  QString lFileName = fileName;
142 
143  if ( isNew )
144  {
145  KTemporaryFile tempFile;
146  tempFile.setAutoRemove( false );
147  if ( tempFile.open() )
148  {
149  lFileName = tempFile.fileName();
150  tempFile.close();
151  }
152  else
153  {
154  KMessageBox::error( this, i18n( "Cannot create new file." ) );
155  return;
156  }
157  }
158 
159  TaskView *taskView = d->mTaskView;
160 
161  connect( taskView, SIGNAL(contextMenuRequested(QPoint)),
162  this, SIGNAL(contextMenuRequested(QPoint)) );
163  connect( taskView, SIGNAL(timersActive()),
164  this, SIGNAL(timersActive()) );
165  connect( taskView, SIGNAL(timersInactive()),
166  this, SIGNAL(timersInactive()) );
167  connect( taskView, SIGNAL(tasksChanged(QList<Task*>)),
168  this, SIGNAL(tasksChanged(QList<Task*>)));
169 
170  emit setCaption( fileName );
171  taskView->load( lFileName );
172  d->mSearchWidget->addTreeWidget( taskView );
173 
174  // When adding the first tab currentChanged is not emitted, so...
175  if ( !d->mTaskView )
176  {
177  emit currentTaskViewChanged();
178  slotCurrentChanged();
179  }
180 }
181 
182 TaskView* TimetrackerWidget::currentTaskView() const
183 {
184  return qobject_cast< TaskView* >( d->mTaskView );
185 }
186 
187 Task* TimetrackerWidget::currentTask()
188 {
189  TaskView *taskView = 0;
190  if ( ( taskView = currentTaskView() ) )
191  {
192  return taskView->currentItem();
193  }
194  else
195  {
196  return 0;
197  }
198 }
199 
200 void TimetrackerWidget::setupActions( KActionCollection *actionCollection )
201 {
202  d->mActions.insert ("file_open",
203  KStandardAction::open( this, SLOT(openFile()), actionCollection ) );
204  d->mActions.insert ("file_save",
205  KStandardAction::save( this, SLOT(saveFile()), actionCollection ) );
206  d->mActions.insert ("file_quit",
207  KStandardAction::quit( this, SLOT(quit()), actionCollection ) );
208  d->mActions.insert ("configure_ktimetracker",
209  KStandardAction::preferences( this, SLOT(showSettingsDialog()),
210  actionCollection ) );
211 
212  Private::ActionData actions[] =
213  {
214  { QString(), I18N_NOOP("Start &New Session"), SLOT(startNewSession()),
215  "start_new_session", I18N_NOOP("Starts a new session"), I18N_NOOP("This will reset the "
216  "session time to 0 for all tasks, to start a new session, without "
217  "affecting the totals.")
218  },
219  { "view-history", I18N_NOOP("Edit History..."), SLOT(editHistory()), "edit_history",
220  I18N_NOOP("Edits history of all tasks of the current document"), I18N_NOOP("A window will "
221  "be opened where you can change start and stop times of tasks or add a "
222  "comment to them.")
223  },
224  { QString(), I18N_NOOP("&Reset All Times"), SLOT(resetAllTimes()),
225  "reset_all_times", I18N_NOOP("Resets all times"), I18N_NOOP("This will reset the session "
226  "and total time to 0 for all tasks, to restart from scratch.")
227  },
228  { "media-playback-start", I18N_NOOP("&Start"), SLOT(startCurrentTimer()), "start",
229  I18N_NOOP("Starts timing for selected task"), I18N_NOOP("This will start timing for the "
230  "selected task.\nIt is even possible to time several tasks "
231  "simultanously.\n\nYou may also start timing of tasks by double clicking "
232  "the left mouse button on a given task. This will, however, stop timing "
233  "of other tasks.")
234  },
235  { "media-playback-stop", I18N_NOOP("S&top"), SLOT(stopCurrentTimer()), "stop",
236  I18N_NOOP("Stops timing of the selected task"), I18N_NOOP("Stops timing of the selected task")
237  },
238  { QString(), I18N_NOOP("Focus on Searchbar"), SLOT(focusSearchBar()), "focusSearchBar",
239  I18N_NOOP("Sets the focus on the searchbar"), I18N_NOOP("Sets the focus on the searchbar")
240  },
241  { QString(), I18N_NOOP("Stop &All Timers"), SLOT(stopAllTimers()), "stopAll",
242  I18N_NOOP("Stops all of the active timers"), I18N_NOOP("Stops all of the active timers")
243  },
244  { QString(), I18N_NOOP("Track Active Applications"), SLOT(focusTracking()),
245  "focustracking", I18N_NOOP("Auto-creates and updates tasks when the focus of the "
246  "current window has changed"), I18N_NOOP("If the focus of a window changes for the "
247  "first time when this action is enabled, a new task will be created "
248  "with the title of the window as its name and will be started. If there "
249  "already exists such an task it will be started.")
250  },
251  // in the following element,
252  // document-new is the icon name, e.g. for the toolbar, new_task is how the action is
253  // called in the ktimetrackerui.rc file, rest should be obvious
254  { "document-new", I18N_NOOP("&New Task..."), SLOT(newTask()), "new_task", I18N_NOOP("Creates "
255  "new top level task"), I18N_NOOP("This will create a new top level task.")
256  },
257  { "subtask-new-ktimetracker", I18N_NOOP("New &Subtask..."), SLOT(newSubTask()),
258  "new_sub_task", I18N_NOOP("Creates a new subtask to the current selected task"),
259  I18N_NOOP("This will create a new subtask to the current selected task.")
260  },
261  { "edit-delete", I18N_NOOP("&Delete"), SLOT(deleteTask()), "delete_task", I18N_NOOP("Deletes "
262  "selected task"), I18N_NOOP("This will delete the selected task(s) and all "
263  "subtasks.")
264  },
265  { "document-properties", I18N_NOOP("&Edit..."), SLOT(editTask()), "edit_task",
266  I18N_NOOP("Edits name or times for selected task"), I18N_NOOP("This will bring up a dialog "
267  "box where you may edit the parameters for the selected task.")
268  },
269  { QString(), I18N_NOOP("&Mark as Complete"), SLOT(markTaskAsComplete()),
270  "mark_as_complete", "", ""
271  },
272  { QString(), I18N_NOOP("&Mark as Incomplete"), SLOT(markTaskAsIncomplete()),
273  "mark_as_incomplete", "", ""
274  },
275  { QString(), I18N_NOOP("&Export Times..."), SLOT(exportcsvFile()), "export_times",
276  "", ""
277  },
278  { QString(), I18N_NOOP("Export &History..."), SLOT(exportcsvHistory()),
279  "export_history", "", ""
280  },
281  { QString(), I18N_NOOP("Import Tasks From &Planner..."), SLOT(importPlanner()),
282  "import_planner", "", ""
283  },
284  { QString(), I18N_NOOP("Show Searchbar"), SLOT(slotSearchBar()), "searchbar",
285  "", ""
286  }
287  };
288 
289  for ( unsigned int i = 0; i < ( sizeof( actions ) / sizeof( Private::ActionData ) ); ++i )
290  {
291  Private::ActionData actionData = actions[i];
292  KAction *action;
293  if ( actionData.iconName.isEmpty() )
294  {
295  action = new KAction( i18n( actionData.caption ), this );
296  }
297  else
298  {
299  action = new KAction( KIcon( actionData.iconName ),
300  i18n( actionData.caption ), this );
301  }
302 
303  actionCollection->addAction( actionData.name, action );
304  connect( action, SIGNAL(triggered(bool)), actionData.slot );
305  action->setToolTip( i18n( actionData.toolTip ) );
306  action->setWhatsThis( i18n( actionData.whatsThis ) );
307 
308  d->mActions.insert( actionData.name, action );
309  }
310 
311  // custom shortcuts
312  d->mActions[ "start" ]->setShortcut( QKeySequence( Qt::Key_G) );
313  d->mActions[ "stopAll" ]->setShortcut( QKeySequence( Qt::Key_Escape ) );
314  d->mActions[ "new_task" ]->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_T ) );
315  d->mActions[ "focusSearchBar" ]->setShortcut( QKeySequence( Qt::Key_S ) );
316  d->mActions[ "new_sub_task" ]->setShortcut( QKeySequence( Qt::CTRL + Qt::ALT + Qt::Key_N ) );
317  d->mActions[ "delete_task" ]->setShortcut( QKeySequence( Qt::Key_Delete ) );
318  d->mActions[ "edit_task" ]->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_E ) );
319  d->mActions[ "mark_as_complete" ]->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_M ) );
320  d->mActions[ "mark_as_incomplete" ]->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_M ) );
321 
322  d->mActions[ "mark_as_complete" ]->setIcon( UserIcon( "task-complete.xpm" ) );
323  d->mActions[ "mark_as_incomplete" ]->setIcon( UserIcon( "task-incomplete.xpm" ) );
324 
325  d->mActions[ "focustracking" ]->setCheckable( true );
326  d->mActions[ "searchbar" ]->setCheckable( true );
327 
328  d->mActions[ "searchbar" ]->setChecked( KTimeTrackerSettings::self()->showSearchBar() );
329 
330  connect( this, SIGNAL(currentTaskChanged()),
331  this, SLOT(slotUpdateButtons()) );
332  connect( this, SIGNAL(currentTaskViewChanged()),
333  this, SLOT(slotUpdateButtons()) );
334  connect( this, SIGNAL(updateButtons()),
335  this, SLOT(slotUpdateButtons()) );
336 }
337 
338 KAction* TimetrackerWidget::action( const QString &name ) const
339 {
340  return d->mActions.value( name );
341 }
342 
343 void TimetrackerWidget::openFile( const QString &fileName )
344 {
345  kDebug(5970) << "Entering function, fileName is " << fileName;
346  QString newFileName = fileName;
347  if ( newFileName.isEmpty() )
348  {
349  newFileName = KFileDialog::getOpenFileName( QString(), QString(), this );
350  if ( newFileName.isEmpty() )
351  {
352  return;
353  }
354  }
355  addTaskView( newFileName );
356 }
357 
358 void TimetrackerWidget::openFile( const KUrl &fileName )
359 {
360  openFile( fileName.toLocalFile() );
361 }
362 
363 bool TimetrackerWidget::closeFile()
364 {
365  kDebug(5970) << "Entering TimetrackerWidget::closeFile";
366  TaskView *taskView = currentTaskView();
367 
368  if ( taskView )
369  {
370  taskView->save();
371  taskView->closeStorage();
372  }
373 
374  d->mSearchWidget->removeTreeWidget( taskView );
375 
376  emit currentTaskViewChanged();
377  emit setCaption( QString() );
378  slotCurrentChanged();
379 
380  delete taskView; // removeTab does not delete its widget.
381  d->mTaskView=0;
382  return true;
383 }
384 
385 void TimetrackerWidget::saveFile()
386 {
387  currentTaskView()->save();
388 }
389 
390 void TimetrackerWidget::showSearchBar( bool visible )
391 {
392  d->mSearchLine->setVisible( visible );
393 }
394 
395 bool TimetrackerWidget::closeAllFiles()
396 {
397  kDebug(5970) << "Entering TimetrackerWidget::closeAllFiles";
398  bool err = true;
399  if (d->mTaskView)
400  {
401  d->mTaskView->stopAllTimers();
402  err=closeFile();
403  }
404  return err;
405 }
406 
407 void TimetrackerWidget::slotCurrentChanged()
408 {
409  kDebug() << "entering KTimetrackerWidget::slotCurrentChanged";
410 
411  if ( d->mTaskView )
412  {
413  disconnect( d->mTaskView, SIGNAL(totalTimesChanged(long,long)) );
414  disconnect( d->mTaskView, SIGNAL(reSetTimes()) );
415  disconnect( d->mTaskView, SIGNAL(itemSelectionChanged()) );
416  disconnect( d->mTaskView, SIGNAL(updateButtons()) );
417  disconnect( d->mTaskView, SIGNAL(setStatusBarText(QString)) );
418  disconnect( d->mTaskView, SIGNAL(timersActive()) );
419  disconnect( d->mTaskView, SIGNAL(timersInactive()) );
420  disconnect( d->mTaskView, SIGNAL(tasksChanged(QList<Task*>)),
421  this, SIGNAL(tasksChanged(QList<Task*>)) );
422 
423  connect( d->mTaskView, SIGNAL(totalTimesChanged(long,long)),
424  this, SIGNAL(totalTimesChanged(long,long)) );
425  connect( d->mTaskView, SIGNAL(reSetTimes()),
426  this, SIGNAL(reSetTimes()) );
427  connect( d->mTaskView, SIGNAL(itemSelectionChanged()),
428  this, SIGNAL(currentTaskChanged()) );
429  connect( d->mTaskView, SIGNAL(updateButtons()),
430  this, SIGNAL(updateButtons()) );
431  connect( d->mTaskView, SIGNAL(setStatusBarText(QString)), // FIXME signature
432  this, SIGNAL(statusBarTextChangeRequested(QString)) );
433  connect( d->mTaskView, SIGNAL(timersActive()),
434  this, SIGNAL(timersActive()) );
435  connect( d->mTaskView, SIGNAL(timersInactive()),
436  this, SIGNAL(timersInactive()) );
437  connect( d->mTaskView, SIGNAL(tasksChanged(QList<Task*>)), // FIXME signature
438  this, SIGNAL(tasksChanged(QList<Task*>)) );
439  emit setCaption( d->mTaskView->storage()->icalfile() );
440  }
441  d->mSearchWidget->setEnabled( d->mTaskView );
442 }
443 
444 
445 bool TimetrackerWidget::eventFilter( QObject *obj, QEvent *event )
446 {
447  if ( obj == d->mSearchWidget )
448  {
449  if ( event->type() == QEvent::KeyPress )
450  {
451  QKeyEvent *keyEvent = static_cast< QKeyEvent* >( event );
452  if ( keyEvent->key() == Qt::Key_Enter ||
453  keyEvent->key() == Qt::Key_Return )
454  {
455  if ( !d->mSearchWidget->displayText().isEmpty() ) slotAddTask( d->mSearchWidget->displayText() );
456  return true;
457  }
458  }
459  }
460  return QObject::eventFilter( obj, event );
461 }
462 
463 void TimetrackerWidget::slotAddTask( const QString &taskName )
464 {
465  TaskView *taskView = currentTaskView();
466  taskView->addTask( taskName, QString(), 0, 0, DesktopList(), 0 );
467 
468  d->mSearchWidget->clear();
469 }
470 
471 void TimetrackerWidget::slotUpdateButtons()
472 {
473  kDebug(5970) << "Entering function";
474  Task *item = currentTask();
475 
476  d->mActions[ "start" ]->setEnabled( item && !item->isRunning() &&
477  !item->isComplete() );
478  d->mActions[ "stop" ]->setEnabled( item && item->isRunning() );
479  d->mActions[ "delete_task" ]->setEnabled( item );
480  d->mActions[ "edit_task" ]->setEnabled( item );
481  d->mActions[ "mark_as_complete" ]->setEnabled( item && !item->isComplete() );
482  d->mActions[ "mark_as_incomplete" ]->setEnabled( item && item->isComplete() );
483 
484  d->mActions[ "new_task" ]->setEnabled( currentTaskView() );
485  d->mActions[ "new_sub_task" ]->setEnabled( currentTaskView() && currentTaskView()->count() );
486  d->mActions[ "focustracking" ]->setEnabled( currentTaskView() );
487  d->mActions[ "focustracking" ]->setChecked( currentTaskView() &&
488  currentTaskView()->isFocusTrackingActive() );
489  d->mActions[ "start_new_session" ]->setEnabled( currentTaskView() );
490  d->mActions[ "edit_history" ]->setEnabled( currentTaskView() );
491  d->mActions[ "reset_all_times" ]->setEnabled( currentTaskView() );
492  d->mActions[ "export_times" ]->setEnabled( currentTaskView() );
493  d->mActions[ "export_history" ]->setEnabled( currentTaskView() );
494  d->mActions[ "import_planner" ]->setEnabled( currentTaskView() );
495  d->mActions[ "file_save" ]->setEnabled( currentTaskView() );
496  kDebug(5970) << "Leaving function";
497 }
498 
499 void TimetrackerWidget::showSettingsDialog()
500 {
501  kDebug(5970) << "Entering function";
502  /* show main window b/c if this method was started from tray icon and the window
503  is not visible the application quits after accepting the settings dialog.
504  */
505  window()->show();
506  KTimeTrackerConfigDialog *dialog=new KTimeTrackerConfigDialog(i18n( "Settings" ), this);
507  dialog->exec();
508  delete dialog;
509  KTimeTrackerSettings::self()->readConfig();
510 
511  showSearchBar(!KTimeTrackerSettings::configPDA() && KTimeTrackerSettings::showSearchBar());
512  currentTaskView()->reconfigure();
513 }
514 
515 //BEGIN wrapper slots
516 void TimetrackerWidget::startCurrentTimer()
517 {
518  currentTaskView()->startCurrentTimer();
519 }
520 
521 void TimetrackerWidget::stopCurrentTimer()
522 {
523  currentTaskView()->stopCurrentTimer();
524 }
525 
526 void TimetrackerWidget::stopAllTimers( const QDateTime &when )
527 {
528  currentTaskView()->stopAllTimers(when);
529 }
530 
531 void TimetrackerWidget::newTask()
532 {
533  currentTaskView()->newTask();
534 }
535 
536 void TimetrackerWidget::newSubTask()
537 {
538  currentTaskView()->newSubTask();
539 }
540 
541 void TimetrackerWidget::editTask()
542 {
543  currentTaskView()->editTask();
544 }
545 
546 void TimetrackerWidget::deleteTask()
547 {
548  currentTaskView()->deleteTask();
549 }
550 
551 void TimetrackerWidget::markTaskAsComplete()
552 {
553  currentTaskView()->markTaskAsComplete();
554 }
555 
556 void TimetrackerWidget::markTaskAsIncomplete()
557 {
558  currentTaskView()->markTaskAsIncomplete();
559 }
560 
561 void TimetrackerWidget::exportcsvFile()
562 {
563  currentTaskView()->exportcsvFile();
564 }
565 
566 void TimetrackerWidget::exportcsvHistory()
567 {
568  currentTaskView()->exportcsvHistory();
569 }
570 
571 void TimetrackerWidget::importPlanner( const QString &fileName )
572 {
573  currentTaskView()->importPlanner(fileName);
574 }
575 
576 void TimetrackerWidget::startNewSession()
577 {
578  currentTaskView()->startNewSession();
579 }
580 
581 void TimetrackerWidget::editHistory()
582 {
583  // historydialog is the new historydialog, but the EditHiStoryDiaLog exists as well.
584  // historydialog can be edited with qtcreator and qtdesigner, EditHiStoryDiaLog cannot.
585  if ( currentTaskView() )
586  {
587  historydialog *dlg = new historydialog( currentTaskView() );
588  if (currentTaskView()->storage()->rawevents().count()!=0) dlg->exec();
589  else KMessageBox::information(0, i18nc("@info in message box", "There is no history yet. Start and stop a task and you will have an entry in your history."));
590  }
591 }
592 
593 void TimetrackerWidget::resetAllTimes()
594 {
595  if ( currentTaskView() )
596  {
597  if ( KMessageBox::warningContinueCancel( this,
598  i18n( "Do you really want to reset the time to zero for all tasks? This will delete the entire history." ),
599  i18n( "Confirmation Required" ), KGuiItem( i18n( "Reset All Times" ) ) ) == KMessageBox::Continue )
600  currentTaskView()->resetTimeForAllTasks();
601  }
602 }
603 
604 void TimetrackerWidget::focusTracking()
605 {
606  currentTaskView()->toggleFocusTracking();
607  d->mActions["focustracking"]->setChecked(currentTaskView()->isFocusTrackingActive());
608 }
609 
610 void TimetrackerWidget::slotSearchBar()
611 {
612  bool currentVisible = KTimeTrackerSettings::self()->showSearchBar();
613  KTimeTrackerSettings::self()->setShowSearchBar( !currentVisible );
614  d->mActions[ "searchbar" ]->setChecked( !currentVisible );
615  showSearchBar( !currentVisible );
616 }
617 //END
618 
620 /* @{ */
621 QString TimetrackerWidget::version() const
622 {
623  return KDEPIM_VERSION;
624 }
625 
626 QStringList TimetrackerWidget::taskIdsFromName( const QString &taskName ) const
627 {
628  QStringList result;
629 
630  TaskView *taskView = currentTaskView();
631  if ( !taskView ) return result;
632  QTreeWidgetItemIterator it( taskView );
633  while ( *it )
634  {
635  Task *task = static_cast< Task* >( *it );
636  if ( task && task->name() == taskName )
637  {
638  result << task->uid();
639  }
640  ++it;
641  }
642 
643  return result;
644 }
645 
646 void TimetrackerWidget::addTask( const QString &taskName )
647 {
648  TaskView *taskView = currentTaskView();
649 
650  if ( taskView )
651  {
652  taskView->addTask( taskName, QString(), 0, 0, DesktopList(), 0 );
653  }
654 }
655 
656 void TimetrackerWidget::addSubTask( const QString& taskName, const QString &taskId )
657 {
658  TaskView *taskView = currentTaskView();
659 
660  if ( taskView )
661  {
662  taskView->addTask( taskName, QString(), 0, 0, DesktopList(), taskView->task( taskId) );
663  taskView->refresh();
664  }
665 }
666 
667 void TimetrackerWidget::deleteTask( const QString &taskId )
668 {
669  TaskView *taskView = currentTaskView();
670 
671  if ( !taskView ) return;
672 
673  QTreeWidgetItemIterator it( taskView );
674  while ( *it )
675  {
676  Task *task = static_cast< Task* >( *it );
677  if ( task && task->uid() == taskId )
678  {
679  taskView->deleteTaskBatch( task );
680  }
681  ++it;
682  }
683 }
684 
685 void TimetrackerWidget::setPercentComplete( const QString &taskId, int percent )
686 {
687  TaskView *taskView = currentTaskView();
688 
689  if ( !taskView ) return;
690 
691  QTreeWidgetItemIterator it( taskView );
692  while ( *it )
693  {
694  Task *task = static_cast< Task* >( *it );
695  if ( task && task->uid() == taskId )
696  {
697  task->setPercentComplete( percent, taskView->storage() );
698  }
699  ++it;
700  }
701 }
702 
703 int TimetrackerWidget::changeTime( const QString &taskId, int minutes )
704 {
705  int result=0;
706  QDate startDate;
707  QTime startTime;
708  QDateTime startDateTime;
709  Task *task = 0, *t = 0;
710 
711  TaskView *taskView;
712 
713  if ( minutes <= 0 ) return KTIMETRACKER_ERR_INVALID_DURATION;
714 
715  // Find task
716  taskView = currentTaskView();
717  if ( taskView ) return KTIMETRACKER_ERR_UID_NOT_FOUND; //FIXME: it mimics the behaviour with the for loop, but I am not sure semantics were right. Maybe a new error code must be defined?
718 
719  QTreeWidgetItemIterator it( taskView );
720  while ( *it ) {
721  t = static_cast< Task* >( *it );
722  if ( t && t->uid() == taskId ) {
723  task = t;
724  break;
725  }
726  ++it;
727  }
728 
729  if ( !task ) result=KTIMETRACKER_ERR_UID_NOT_FOUND;
730  else task->changeTime(minutes, task->taskView()->storage());
731  return result;
732 }
733 
734 QString TimetrackerWidget::error( int errorCode ) const
735 {
736  switch ( errorCode )
737  {
738  case KTIMETRACKER_ERR_GENERIC_SAVE_FAILED:
739  return i18n( "Save failed, most likely because the file could not be locked." );
740  case KTIMETRACKER_ERR_COULD_NOT_MODIFY_RESOURCE:
741  return i18n( "Could not modify calendar resource." );
742  case KTIMETRACKER_ERR_MEMORY_EXHAUSTED:
743  return i18n( "Out of memory--could not create object." );
744  case KTIMETRACKER_ERR_UID_NOT_FOUND:
745  return i18n( "UID not found." );
746  case KTIMETRACKER_ERR_INVALID_DATE:
747  return i18n( "Invalidate date--format is YYYY-MM-DD." );
748  case KTIMETRACKER_ERR_INVALID_TIME:
749  return i18n( "Invalid time--format is YYYY-MM-DDTHH:MM:SS." );
750  case KTIMETRACKER_ERR_INVALID_DURATION:
751  return i18n( "Invalid task duration--must be greater than zero." );
752  default:
753  return i18n( "Invalid error number: %1", errorCode );
754  }
755 }
756 
757 bool TimetrackerWidget::isIdleDetectionPossible() const
758 {
759  bool result;
760  IdleTimeDetector *idletimedetector1=new IdleTimeDetector(50);
761  result=idletimedetector1->isIdleDetectionPossible();
762  delete idletimedetector1;
763  return result;
764 }
765 
766 int TimetrackerWidget::totalMinutesForTaskId( const QString &taskId ) const
767 {
768  TaskView *taskView = currentTaskView();
769  if ( !taskView ) return -1;
770  QTreeWidgetItemIterator it( taskView );
771  while ( *it )
772  {
773  Task *task = static_cast< Task* >( *it );
774  if ( task && task->uid() == taskId )
775  {
776  return task->totalTime();
777  }
778  ++it;
779  }
780  return -1;
781 }
782 
783 void TimetrackerWidget::startTimerFor( const QString &taskId )
784 {
785  kDebug();
786 
787  TaskView *taskView = currentTaskView();
788  if ( !taskView ) return;
789  QTreeWidgetItemIterator it( taskView );
790  while ( *it )
791  {
792  Task *task = static_cast< Task* >( *it );
793  if ( task && task->uid() == taskId )
794  {
795  taskView->startTimerFor( task );
796  return;
797  }
798  ++it;
799  }
800 }
801 
802 bool TimetrackerWidget::startTimerForTaskName( const QString &taskName )
803 {
804  TaskView *taskView = currentTaskView();
805  if ( !taskView ) return false;
806  QTreeWidgetItemIterator it( taskView );
807  while ( *it )
808  {
809  Task *task = static_cast< Task* >( *it );
810  if ( task && task->name() == taskName )
811  {
812  taskView->startTimerFor( task );
813  return true;
814  }
815  ++it;
816  }
817  return false;
818 }
819 
820 
821 bool TimetrackerWidget::stopTimerForTaskName( const QString &taskName )
822 {
823  TaskView *taskView = currentTaskView();
824  if ( !taskView ) return false;
825 
826  QTreeWidgetItemIterator it( taskView );
827  while ( *it )
828  {
829  Task *task = static_cast< Task* >( *it );
830 
831  if ( task && task->name() == taskName )
832  {
833  taskView->stopTimerFor( task );
834  return true;
835  }
836  ++it;
837  }
838  return false;
839 }
840 
841 
842 void TimetrackerWidget::stopTimerFor( const QString &taskId )
843 {
844  TaskView *taskView = currentTaskView();
845  if ( !taskView ) return;
846  QTreeWidgetItemIterator it( taskView );
847  while ( *it )
848  {
849  Task *task = static_cast< Task* >( *it );
850  if ( task && task->uid() == taskId )
851  {
852  taskView->stopTimerFor( task );
853  return;
854  }
855  ++it;
856  }
857 }
858 
859 void TimetrackerWidget::stopAllTimersDBUS()
860 {
861  TaskView *taskView = currentTaskView();
862  if (taskView) taskView->stopAllTimers();
863 }
864 
865 QString TimetrackerWidget::exportCSVFile( const QString &filename,
866  const QString &from,
867  const QString &to, int type,
868  bool decimalMinutes,
869  bool allTasks,
870  const QString &delimiter,
871  const QString &quote )
872 {
873  TaskView *taskView = currentTaskView();
874 
875  if ( !taskView ) return "";
876  ReportCriteria rc;
877  rc.url = filename;
878  rc.from = QDate::fromString( from );
879  if ( rc.from.isNull() )
880  rc.from = QDate::fromString( from, Qt::ISODate );
881  rc.to = QDate::fromString( to );
882  if ( rc.to.isNull() )
883  rc.to = QDate::fromString( to, Qt::ISODate );
884  rc.reportType = ( ReportCriteria::REPORTTYPE )type;
885  rc.decimalMinutes = decimalMinutes;
886  rc.allTasks = allTasks;
887  rc.delimiter = delimiter;
888  rc.quote = quote;
889 
890  return taskView->report( rc );
891 }
892 
893 void TimetrackerWidget::importPlannerFile( const QString &filename )
894 {
895  TaskView *taskView = currentTaskView();
896  if ( !taskView ) return;
897  taskView->importPlanner( filename );
898 }
899 
900 bool TimetrackerWidget::isActive( const QString &taskId ) const
901 {
902  TaskView *taskView = currentTaskView();
903  if ( !taskView ) return false;
904  QTreeWidgetItemIterator it( taskView );
905  while ( *it )
906  {
907  Task *task = static_cast< Task* >( *it );
908 
909  if ( task && task->uid() == taskId )
910  {
911  return task->isRunning();
912  }
913  ++it;
914  }
915  return false;
916 }
917 
918 bool TimetrackerWidget::isTaskNameActive( const QString &taskName ) const
919 {
920  TaskView *taskView = currentTaskView();
921  if ( !taskView ) return false;
922  QTreeWidgetItemIterator it( taskView );
923  while ( *it )
924  {
925  Task *task = static_cast< Task* >( *it );
926  if ( task && task->name() == taskName )
927  {
928  return task->isRunning();
929  }
930  ++it;
931  }
932  return false;
933 }
934 
935 QStringList TimetrackerWidget::tasks() const
936 {
937  QStringList result;
938 
939  TaskView *taskView = currentTaskView();
940  if ( !taskView ) return result;
941  QTreeWidgetItemIterator it( taskView );
942  while ( *it )
943  {
944  result << static_cast< Task* >( *it )->name();
945  ++it;
946  }
947  return result;
948 }
949 
950 QStringList TimetrackerWidget::activeTasks() const
951 {
952  QStringList result;
953  TaskView *taskView = currentTaskView();
954  if ( !taskView ) return result;
955  for ( int j = 0; j < taskView->count(); ++j )
956  {
957  if ( taskView->itemAt( j )->isRunning() )
958  {
959  result << taskView->itemAt( j )->name();
960  }
961  }
962  return result;
963 }
964 
965 void TimetrackerWidget::saveAll()
966 {
967  currentTaskView()->save();
968 }
969 
970 bool TimetrackerWidget::event ( QEvent * event ) // inherited from QWidget
971 {
972  if (event->type()==QEvent::QueryWhatsThis)
973  {
974  if ( d->mTaskView->count() == 0 )
975  setWhatsThis( i18n("This is ktimetracker, KDE's program to help you track your time. Best, start with creating your first task - enter it into the field where you see \"search or add task\".") );
976  else setWhatsThis( i18n("You have already created a task. You can now start and stop timing") );
977  }
978  return QWidget::event(event);
979 }
980 
981 void TimetrackerWidget::quit()
982 {
983  kDebug(5970) << "Entering TimetrackerWidget::quit";
984  if ( closeAllFiles() )
985  {
986  kapp->quit();
987  }
988 }
989 // END of dbus slots group
990 /* @} */
991 #include "timetrackerwidget.moc"
timetrackerwidget.h
ReportCriteria::from
QDate from
For history reports, the lower bound of the date range to report on.
Definition: reportcriteria.h:63
Task::setPercentComplete
void setPercentComplete(const int percent, timetrackerstorage *storage)
Update percent complete for this task.
Definition: task.cpp:238
TimetrackerWidget::setCaption
void setCaption(const QString &qs)
Task::taskView
TaskView * taskView() const
Return task view for this task.
Definition: task.h:74
TimetrackerWidget::currentTaskChanged
void currentTaskChanged()
ReportCriteria::quote
QString quote
The quote to use for text fields when outputting comma-separated reports.
Definition: reportcriteria.h:99
IdleTimeDetector::isIdleDetectionPossible
bool isIdleDetectionPossible()
Returns true if it is possible to do idle detection.
Definition: idletimedetector.cpp:57
TimetrackerWidget::exportCSVFile
QString exportCSVFile(const QString &filename, const QString &from, const QString &to, int type, bool decimalMinutes, bool allTasks, const QString &delimiter, const QString &quote)
Definition: timetrackerwidget.cpp:865
TimetrackerWidget::deleteTask
void deleteTask()
Definition: timetrackerwidget.cpp:546
TimetrackerWidget::importPlannerFile
void importPlannerFile(const QString &filename)
Definition: timetrackerwidget.cpp:893
TimetrackerWidget::timersActive
void timersActive()
historydialog.h
TimetrackerWidget::changeTime
int changeTime(const QString &taskId, int minutes)
Definition: timetrackerwidget.cpp:703
TimetrackerWidget::tasksChanged
void tasksChanged(const QList< Task * > &)
TimetrackerWidget::stopTimerForTaskName
bool stopTimerForTaskName(const QString &taskName)
Definition: timetrackerwidget.cpp:821
TimetrackerWidget::importPlanner
void importPlanner(const QString &fileName="")
Definition: timetrackerwidget.cpp:571
TimetrackerWidget::error
QString error(int errorCode) const
Definition: timetrackerwidget.cpp:734
TimetrackerWidget
Definition: timetrackerwidget.h:36
TimetrackerWidget::tasks
QStringList tasks() const
Definition: timetrackerwidget.cpp:935
ktimetrackerconfigdialog.h
TimetrackerWidget::isTaskNameActive
bool isTaskNameActive(const QString &taskId) const
Definition: timetrackerwidget.cpp:918
TaskView::toggleFocusTracking
void toggleFocusTracking()
Toggles the automatic tracking of focused windows.
Definition: taskview.cpp:766
Task::name
QString name() const
returns the name of this task.
Definition: task.cpp:680
TaskView::editTask
void editTask()
Calls editTask dialog for the current task.
Definition: taskview.cpp:939
TaskView::importPlanner
void importPlanner(const QString &fileName="")
used to import tasks from imendio planner
Definition: taskview.cpp:602
KTIMETRACKER_ERR_INVALID_DURATION
Definition: ktimetrackerutility.h:63
TimetrackerWidget::markTaskAsIncomplete
void markTaskAsIncomplete()
Definition: timetrackerwidget.cpp:556
TimetrackerWidget::editTask
void editTask()
Definition: timetrackerwidget.cpp:541
TimetrackerWidget::updateButtons
void updateButtons()
TaskView::itemAt
Task * itemAt(int i)
Return the i'th item (zero-based), cast to a Task pointer.
Definition: taskview.cpp:405
ReportCriteria::url
KUrl url
For reports that write to a file, the filename to write to.
Definition: reportcriteria.h:58
TimetrackerWidget::closeFile
bool closeFile()
closes the current opened tab widget and saves the data of the corresponding taskview.
Definition: timetrackerwidget.cpp:363
QWidget
TimetrackerWidget::currentTaskView
TaskView * currentTaskView() const
Returns the TaskView widget of the current opened tabpage.
Definition: timetrackerwidget.cpp:182
TaskView::count
long count()
Return the total number of items in the view.
Definition: taskview.cpp:653
TimetrackerWidget::contextMenuRequested
void contextMenuRequested(const QPoint &pos)
TaskView::startTimerFor
void startTimerFor(Task *task, const QDateTime &startTime=QDateTime::currentDateTime())
starts timer for task.
Definition: taskview.cpp:721
TimetrackerWidget::activeTasks
QStringList activeTasks() const
Definition: timetrackerwidget.cpp:950
TimetrackerWidget::event
bool event(QEvent *event)
Definition: timetrackerwidget.cpp:970
TimetrackerWidget::version
QString version() const
Definition: timetrackerwidget.cpp:621
IdleTimeDetector
Keep track of how long the computer has been idle.
Definition: idletimedetector.h:47
QObject
TimetrackerWidget::saveAll
void saveAll()
Definition: timetrackerwidget.cpp:965
TaskView::task
Task * task(const QString &uid)
return the task with the given UID
Definition: taskview.cpp:677
TimetrackerWidget::setupActions
void setupActions(KActionCollection *actionCollection)
initializes the KActionCollection object of a main window for example.
Definition: timetrackerwidget.cpp:200
TaskView::stopCurrentTimer
void stopCurrentTimer()
Stop the timer for the current item in the view.
Definition: taskview.cpp:845
TimetrackerWidget::exportcsvFile
void exportcsvFile()
Definition: timetrackerwidget.cpp:561
TimetrackerWidget::totalMinutesForTaskId
int totalMinutesForTaskId(const QString &taskId) const
Definition: timetrackerwidget.cpp:766
Task::isComplete
bool isComplete()
Return true if task is complete (percent complete equals 100).
Definition: task.cpp:304
TaskView::markTaskAsIncomplete
void markTaskAsIncomplete()
Definition: taskview.cpp:1074
reportcriteria.h
TaskView::markTaskAsComplete
void markTaskAsComplete()
Definition: taskview.cpp:1045
TimetrackerWidget::setPercentComplete
void setPercentComplete(const QString &taskId, int percent)
Definition: timetrackerwidget.cpp:685
ReportCriteria::delimiter
QString delimiter
The delimiter to use when outputting comma-separated value reports.
Definition: reportcriteria.h:94
taskview.h
TimetrackerWidget::focusSearchBar
int focusSearchBar()
this method puts the input focus onto the search bar
Definition: timetrackerwidget.cpp:130
ReportCriteria::reportType
REPORTTYPE reportType
The type of report we are running.
Definition: reportcriteria.h:53
TaskView::newTask
void newTask()
Calls newTask dialog with caption "New Task".
Definition: taskview.cpp:865
KTimeTrackerSettings::showSearchBar
static bool showSearchBar()
Get showSearchBar.
Definition: ktimetracker.h:31
TaskView::startNewSession
void startNewSession()
Reset session time to zero for all tasks.
Definition: taskview.cpp:783
TaskView::refresh
void refresh()
Used to refresh (e.g.
Definition: taskview.cpp:526
TimetrackerWidget::isIdleDetectionPossible
bool isIdleDetectionPossible() const
Definition: timetrackerwidget.cpp:757
TaskView::startCurrentTimer
void startCurrentTimer()
Start the timer on the current item (task) in view.
Definition: taskview.cpp:716
TaskView::allEventsHaveEndTiMe
bool allEventsHaveEndTiMe()
Deliver if all events from the storage have and end time.
Definition: taskview.cpp:508
Task::uid
QString uid() const
Return unique iCalendar Todo ID for this task.
Definition: task.cpp:660
TaskView::exportcsvFile
void exportcsvFile()
Export comma separated values format for task time totals.
Definition: taskview.cpp:622
TaskView::closeStorage
void closeStorage()
Close the storage and release lock.
Definition: taskview.cpp:503
TimetrackerWidget::focusTracking
void focusTracking()
Definition: timetrackerwidget.cpp:604
KTIMETRACKER_ERR_COULD_NOT_MODIFY_RESOURCE
Definition: ktimetrackerutility.h:58
ReportCriteria
Stores entries from export dialog.
Definition: reportcriteria.h:41
ktimetracker.h
TaskView::storage
timetrackerstorage * storage()
Returns a pointer to storage object.
Definition: taskview.cpp:387
TimetrackerWidget::stopTimerFor
void stopTimerFor(const QString &taskId)
Definition: timetrackerwidget.cpp:842
TimetrackerWidget::showSearchBar
void showSearchBar(bool visible)
shows/hides the search bar.
Definition: timetrackerwidget.cpp:390
KTIMETRACKER_ERR_INVALID_TIME
Definition: ktimetrackerutility.h:62
Task::isRunning
bool isRunning() const
return the state of a task - if it's running or not
Definition: task.cpp:208
TaskView::deleteTask
void deleteTask(Task *task=0)
Deletes the given or the current task (and children) from the view.
Definition: taskview.cpp:1018
TaskView::stopTimerFor
void stopTimerFor(Task *task)
Definition: taskview.cpp:828
TimetrackerWidget::saveFile
void saveFile()
saves the current taskview.
Definition: timetrackerwidget.cpp:385
TimetrackerWidget::addTask
void addTask(const QString &taskName)
Definition: timetrackerwidget.cpp:646
TimetrackerWidget::allEventsHaveEndTiMe
bool allEventsHaveEndTiMe()
Delivers if all task have an end time.
Definition: timetrackerwidget.cpp:125
TaskView::deleteTaskBatch
void deleteTaskBatch(Task *task=0)
Deletes the given or the current task (and children) from the view.
Definition: taskview.cpp:1000
TimetrackerWidget::slotSearchBar
void slotSearchBar()
Definition: timetrackerwidget.cpp:610
TimetrackerWidget::newTask
void newTask()
Definition: timetrackerwidget.cpp:531
TimetrackerWidget::addSubTask
void addSubTask(const QString &taskName, const QString &taskId)
Definition: timetrackerwidget.cpp:656
Task::changeTime
void changeTime(long minutes, timetrackerstorage *storage)
Change task time.
Definition: task.cpp:407
KTimeTrackerSettings::setShowSearchBar
static void setShowSearchBar(bool v)
Set showSearchBar.
Definition: ktimetracker.h:21
TimetrackerWidget::newSubTask
void newSubTask()
Definition: timetrackerwidget.cpp:536
TimetrackerWidget::reSetTimes
void reSetTimes()
TimetrackerWidget::quit
void quit()
Definition: timetrackerwidget.cpp:981
KTimeTrackerSettings::self
static KTimeTrackerSettings * self()
Definition: ktimetracker.cpp:17
TimetrackerWidget::resetAllTimes
void resetAllTimes()
Definition: timetrackerwidget.cpp:593
TimetrackerWidget::currentTask
Task * currentTask()
Returns the current task of the current opened TaskView widget.
Definition: timetrackerwidget.cpp:187
DesktopList
QVector< int > DesktopList
Definition: desktoplist.h:28
ReportCriteria::decimalMinutes
bool decimalMinutes
True if the durations should be output in decimal hours.
Definition: reportcriteria.h:74
task.h
TimetrackerWidget::totalTimesChanged
void totalTimesChanged(long session, long total)
ReportCriteria::allTasks
bool allTasks
True if user chose to export all tasks, not only the selected one.
Definition: reportcriteria.h:84
TimetrackerWidget::statusBarTextChangeRequested
void statusBarTextChangeRequested(const QString &text)
ReportCriteria::REPORTTYPE
REPORTTYPE
The different report types.
Definition: reportcriteria.h:48
KTIMETRACKER_ERR_MEMORY_EXHAUSTED
Definition: ktimetrackerutility.h:59
name
const char * name
Definition: toolicons.h:159
TimetrackerWidget::startCurrentTimer
void startCurrentTimer()
Definition: timetrackerwidget.cpp:516
KTIMETRACKER_ERR_INVALID_DATE
Definition: ktimetrackerutility.h:61
KTIMETRACKER_ERR_GENERIC_SAVE_FAILED
Definition: ktimetrackerutility.h:57
TimetrackerWidget::TimetrackerWidget
TimetrackerWidget(QWidget *parent=0)
Definition: timetrackerwidget.cpp:90
idletimedetector.h
TaskView::reconfigure
void reconfigure()
Reconfigures taskView depending on current configuration.
Definition: taskview.cpp:1191
TaskView::load
void load(const QString &filename)
Load the view from storage.
Definition: taskview.cpp:422
historydialog
Definition: historydialog.h:33
TimetrackerWidget::taskIdsFromName
QStringList taskIdsFromName(const QString &taskName) const
Definition: timetrackerwidget.cpp:626
TimetrackerWidget::stopAllTimersDBUS
void stopAllTimersDBUS()
Definition: timetrackerwidget.cpp:859
TaskView::report
QString report(const ReportCriteria &rc)
call export function for csv totals or history
Definition: taskview.cpp:617
TimetrackerWidget::stopCurrentTimer
void stopCurrentTimer()
Definition: timetrackerwidget.cpp:521
TimetrackerWidget::isActive
bool isActive(const QString &taskId) const
Definition: timetrackerwidget.cpp:900
TimetrackerWidget::startTimerFor
void startTimerFor(const QString &taskId)
Definition: timetrackerwidget.cpp:783
TimetrackerWidget::stopAllTimers
void stopAllTimers(const QDateTime &when=QDateTime::currentDateTime())
Definition: timetrackerwidget.cpp:526
ktimetrackerutility.h
TaskView::save
void save()
Save to persistent storage.
Definition: taskview.cpp:698
TaskView::stopAllTimers
void stopAllTimers(const QDateTime &when=QDateTime::currentDateTime())
Stop all running timers.
Definition: taskview.cpp:745
TaskView::newSubTask
void newSubTask()
Calls newTask dialog with caption "New Sub Task".
Definition: taskview.cpp:929
TimetrackerWidget::editHistory
void editHistory()
Definition: timetrackerwidget.cpp:581
KTimeTrackerSettings::configPDA
static bool configPDA()
Get configPDA.
Definition: ktimetracker.h:335
TimetrackerWidget::action
KAction * action(const QString &name) const
returns a generated action by name.
Definition: timetrackerwidget.cpp:338
ReportCriteria::to
QDate to
For history reports, the upper bound of the date range to report on.
Definition: reportcriteria.h:68
KTimeTrackerConfigDialog
Definition: ktimetrackerconfigdialog.h:28
TaskView
Container and interface for the tasks.
Definition: taskview.h:50
Task
A class representing a task.
Definition: task.h:54
TimetrackerWidget::~TimetrackerWidget
~TimetrackerWidget()
Definition: timetrackerwidget.cpp:120
TimetrackerWidget::currentTaskViewChanged
void currentTaskViewChanged()
TaskView::exportcsvHistory
QString exportcsvHistory()
Export comma-separated values format for task history.
Definition: taskview.cpp:637
TimetrackerWidget::startNewSession
void startNewSession()
Definition: timetrackerwidget.cpp:576
TimetrackerWidget::markTaskAsComplete
void markTaskAsComplete()
Definition: timetrackerwidget.cpp:551
TimetrackerWidget::openFile
void openFile(const QString &fileName=QString())
opens an existing ics file.
Definition: timetrackerwidget.cpp:343
TimetrackerWidget::startTimerForTaskName
bool startTimerForTaskName(const QString &taskName)
Definition: timetrackerwidget.cpp:802
TaskView::currentItem
Task * currentItem() const
Return the current item in the view, cast to a Task pointer.
Definition: taskview.cpp:399
KTIMETRACKER_ERR_UID_NOT_FOUND
Definition: ktimetrackerutility.h:60
TimetrackerWidget::timersInactive
void timersInactive()
TaskView::resetTimeForAllTasks
void resetTimeForAllTasks()
Reset session and total time to zero for all tasks.
Definition: taskview.cpp:799
TimetrackerWidget::exportcsvHistory
void exportcsvHistory()
Definition: timetrackerwidget.cpp:566
TaskView::addTask
QString addTask(const QString &taskame, const QString &taskdescription=QString(), long total=0, long session=0, const DesktopList &desktops=QVector< int >(0, 0), Task *parent=0)
Add a task to view and storage.
Definition: taskview.cpp:902
Task::totalTime
long totalTime() const
Definition: task.h:206
TimetrackerWidget::closeAllFiles
bool closeAllFiles()
tries to close all files.
Definition: timetrackerwidget.cpp:395
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:55:10 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

ktimetracker

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

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

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