-rw-r--r-- | bin/kdepim/timetrackerhowto.txt | 68 | ||||
-rw-r--r-- | korganizer/mainwindow.cpp | 8 | ||||
-rw-r--r-- | korganizer/mainwindow.h | 1 | ||||
-rw-r--r-- | libkcal/todo.cpp | 4 |
4 files changed, 79 insertions, 2 deletions
diff --git a/bin/kdepim/timetrackerhowto.txt b/bin/kdepim/timetrackerhowto.txt new file mode 100644 index 0000000..69fe1ea --- a/dev/null +++ b/bin/kdepim/timetrackerhowto.txt @@ -0,0 +1,68 @@ + +KO/Pi timetracker HowTo + +In KO/Pi you can set a todo in a "running" state to track your working time on that todo. +This Howto is about to use that timetracking feature. + +CONTENT: + +0) Tracking time - setting a todo to started and stopped +1) Getting the time information +2) Overview and analysis of the timetracking data + +******************************************** +0) Tracking time - setting a todo to started +******************************************** + +To track time open the todo view in KO/Pi. +There you can set a todo to the "running" state. +You can do this by choosing "Start/Stop todo.." from the context menu for that todo or by double clicking on the start time or start date column of that todo. +A started todo is displayed green and the start time and date values in the todo list are displaying the start time. +If a parent todo with a running sub todo is displayed closed in the todo view that parent todo is displayed green as well. +If a todo is running the running information is stored every five minutes (not configureable). +(Nothing is changed in the todo itself: If the todo has a start datetime set only the display changes for the time this todo is set to running.) +You can edit a running todo as usual. +If you delete a running todo its running information is saved automatically +You can set the todo to "stopped" in the same way. +If a todo is set to "stopped" within 30 seconds after the start, nothing is stored. +If a todo is set to stopped, its running information is stored in the directory +<yourhome>/kdepim/apps/timetrackerdir/ +If you close the application all running todos are set to stopped and the running information is stored automatically. +That does mean: If you start KO/Pi there will be no todo in the "running" state. + +******************************************** +1) Getting the time information +******************************************** + +All data is stored in the dir +<yourhome>/kdepim/apps/timetrackerdir/ + +There are two kind of files: +E.g. +20050417-090628-libkcal-1503885238.271.ics +and +libkcal-1387036159.309.ics + +The filenames with the datetime at the beginning contains the actual tracking data: +The datetime part of the filename is the start datetime of this run of that todo. +The same value you can find in the file as "DTSTART" value. +The end datetime of the tracking you can find in the file as the "DUE" value. + +A file without a datetime at the beginning +(libkcal-1387036159.309.ics in our example) +contains no timetracking information and contains only information about a parent todo of a todo with timetracking information. +This file is needed to display the parent-child relationchip you can see in the KO/Pi todo view in the timetracking overview application: + +******************************************** +2) Overview and analysis of the timetracking data +******************************************** + +Because every timetracking run is stored in a single file it is easy to merge the data from several computers of the same person or from several persons by copying all the files into the same directory. +There is an application which reads the content of that directory and displays the running information of each todo in a so called timetable "Gantt" view. +It makes it possible to create and print reports for specific time frames. +The default display is exactly like the parent-child relationchip displayed in the KO/Pi todo view, but it is possible to sort items by categories and by attendees. +This program will only be available for the desktop (Windows and Linux). +This program is not free open source software. +There are no decisions about the distribution model (licence model and price) yet. +You can find more information about that program after the beginning of June 2005 at www.pi-sync.net. +
\ No newline at end of file diff --git a/korganizer/mainwindow.cpp b/korganizer/mainwindow.cpp index ffc4d9a..8e5d108 100644 --- a/korganizer/mainwindow.cpp +++ b/korganizer/mainwindow.cpp @@ -1066,48 +1066,52 @@ void MainWindow::initActions() this ); action->addTo( importMenu ); connect( action, SIGNAL( activated() ), this, SLOT( close() ) ); //menuBar->insertItem( "Configure",configureMenu ); //configureMenu->insertItem( "Toolbar",configureToolBarMenu ); icon = loadPixmap( "korganizer/korganizer" ); action = new QAction( "Whats New", i18n("What's new?"), 0,this ); action->addTo( helpMenu ); connect( action, SIGNAL( activated() ), SLOT( whatsNew() ) ); action = new QAction( "featureHowto", i18n("Features + hints..."), 0,this ); action->addTo( helpMenu ); connect( action, SIGNAL( activated() ), SLOT( features() ) ); action = new QAction( "Keys + Colors", i18n("Keys + Colors..."), 0, this ); action->addTo( helpMenu ); connect( action, SIGNAL( activated() ), SLOT( keyBindings() ) ); action = new QAction( "Storage Howto", i18n("Storage HowTo..."), 0,this ); action->addTo( helpMenu ); connect( action, SIGNAL( activated() ), SLOT( storagehowto() ) ); + action = new QAction( "Timetracking Howto", i18n("Timetracking HowTo..."), 0,this ); + action->addTo( helpMenu ); + connect( action, SIGNAL( activated() ), + SLOT( timetrackinghowto() ) ); action = new QAction( "Sync Howto", i18n("Sync HowTo..."), 0,this ); action->addTo( helpMenu ); connect( action, SIGNAL( activated() ), SLOT( synchowto() ) ); action = new QAction( "KDE Sync Howto", i18n("KDE Sync HowTo..."), 0,this ); action->addTo( helpMenu ); connect( action, SIGNAL( activated() ), SLOT( kdesynchowto() ) ); action = new QAction( "Multi Sync Howto", i18n("Multi Sync HowTo..."), 0,this ); action->addTo( helpMenu ); connect( action, SIGNAL( activated() ), SLOT( multisynchowto() ) ); action = new QAction( "Auto saving", i18n("Auto saving..."), 0, this ); action->addTo( helpMenu ); connect( action, SIGNAL( activated() ), SLOT( aboutAutoSaving() ) ); action = new QAction( "Problemd", i18n("Known Problems..."), 0,this ); action->addTo( helpMenu ); connect( action, SIGNAL( activated() ), SLOT( aboutKnownBugs() ) ); action = new QAction( "Translate Howto", i18n("User translation..."), 0,this ); action->addTo( helpMenu ); connect( action, SIGNAL( activated() ), SLOT( usertrans() ) ); @@ -1380,48 +1384,52 @@ void MainWindow::displayText( QString text ,QString cap ) #ifdef DESKTOP_VERSION dia.resize( 640, 480); #else dia.showMaximized(); #endif dia.exec(); } void MainWindow::features() { KApplication::showFile( i18n("KO/Pi Features and hints"), "kdepim/korganizer/featuresKOPI.txt" ); } void MainWindow::usertrans() { KApplication::showFile( i18n("KO/Pi User translation HowTo"), "kdepim/korganizer/usertranslationHOWTO.txt" ); } void MainWindow::storagehowto() { KApplication::showFile( "KDE-Pim/Pi Storage HowTo", "kdepim/storagehowto.txt" ); } +void MainWindow::timetrackinghowto() +{ + KApplication::showFile( "KO/Pi Timetracking HowTo", "kdepim/timetrackerhowto.txt" ); +} void MainWindow::kdesynchowto() { KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/Zaurus-KDE_syncHowTo.txt" ); } void MainWindow::multisynchowto() { KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/MultiSyncHowTo.txt" ); } void MainWindow::synchowto() { KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" ); } void MainWindow::faq() { KApplication::showFile( i18n("KO/Pi FAQ"), "kdepim/korganizer/kopiFAQ.txt" ); } void MainWindow::whatsNew() { KApplication::showFile( "KDE-Pim/Pi Version Info", "kdepim/WhatsNew.txt" ); } void MainWindow::licence() { diff --git a/korganizer/mainwindow.h b/korganizer/mainwindow.h index 3151f50..f2a6c60 100644 --- a/korganizer/mainwindow.h +++ b/korganizer/mainwindow.h @@ -47,48 +47,49 @@ class MainWindow : public QMainWindow MainWindow( QWidget *parent = 0, const char *name = 0, QString command = ""); ~MainWindow(); bool beamReceiveEnabled(); static QString defaultFileName(); static QString syncFileName(); static QString resourcePath(); public slots: void setCaption ( const QString & ); void updateWeekNum(const KCal::DateList &); void updateWeek(QDate); void updateFilterToolbar(); virtual void showMaximized (); void configureAgenda( int ); void recieve( const QCString& msg, const QByteArray& data ); protected slots: void setCaptionToDates(); void weekAction(); void about(); void licence(); void faq(); void usertrans(); void features(); void synchowto(); void storagehowto(); + void timetrackinghowto(); void kdesynchowto(); void multisynchowto(); void whatsNew(); void keyBindings(); void aboutAutoSaving();; void aboutKnownBugs(); void processIncidenceSelection( Incidence * ); void importQtopia(); void importBday(); void importOL(); void importIcal(); void importFile( QString, bool ); void quickImportIcal(); void slotModifiedChanged( bool ); void save(); void saveStopTimer(); void configureToolBar( int ); void printSel(); void printCal(); void saveCalendar(); diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp index 6a6c137..002d3f2 100644 --- a/libkcal/todo.cpp +++ b/libkcal/todo.cpp @@ -74,83 +74,83 @@ void Todo::setRunning( bool run ) if ( mRunning ) { mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min mRunStart = QDateTime::currentDateTime(); } else { mRunSaveTimer->stop(); saveRunningInfoToFile(); } } void Todo::saveRunningInfoToFile() { //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1()); if ( mRunStart.secsTo ( QDateTime::currentDateTime() ) < 30 ) { qDebug("Running time < 30 seconds. Skipped. "); return; } QString dir = KGlobalSettings::timeTrackerDir(); //qDebug("%s ", dir.latin1()); QString file = "%1%2%3-%4%5%6-"; file = file.arg( mRunStart.date().year(), 4).arg( mRunStart.date().month(),2 ).arg( mRunStart.date().day(), 2 ).arg( mRunStart.time().hour(),2 ).arg( mRunStart.time().minute(),2 ).arg( mRunStart.time().second(),2 ); file.replace ( QRegExp (" "), "0" ); file += uid(); //qDebug("File %s ",file.latin1() ); CalendarLocal cal; - cal.setTimeZoneId( " 00:00 Europe/London(UTC)" ); + cal.setLocalTime(); Todo * to = (Todo*) clone(); to->setFloats( false ); to->setDtStart( mRunStart ); to->setHasStartDate( true ); to->setDtDue( QDateTime::currentDateTime() ); to->setHasDueDate( true ); to->setUid( file ); cal.addIncidence( to ); ICalFormat format; file = dir +"/" +file +".ics"; format.save( &cal, file ); saveParents(); } void Todo::saveParents() { if (!relatedTo() ) return; Incidence * inc = relatedTo(); if ( inc->type() != "Todo" ) return; Todo* to = (Todo*)inc; bool saveTodo = false; QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics"; QFileInfo fi ( file ); if ( fi.exists() ) { if ( fi.lastModified () < to->lastModified ()) saveTodo = true; } else { saveTodo = true; } if ( saveTodo ) { CalendarLocal cal; - cal.setTimeZoneId( " 00:00 Europe/London(UTC)" ); + cal.setLocalTime(); Todo * par = (Todo *) to->clone(); cal.addIncidence( par ); ICalFormat format; format.save( &cal, file ); } to->saveParents(); } int Todo::runTime() { if ( !mRunning ) return 0; return mRunStart.secsTo( QDateTime::currentDateTime() ); } bool Todo::hasRunningSub() { if ( mRunning ) return true; Incidence *aTodo; for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { if ( ((Todo*)aTodo)->hasRunningSub() ) return true; } return false; |