00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <qbuttongroup.h>
00024 #include <qcombobox.h>
00025 #include <qgroupbox.h>
00026 #include <qhbox.h>
00027 #include <qlabel.h>
00028 #include <qlayout.h>
00029 #include <qlineedit.h>
00030 #include <qradiobutton.h>
00031 #include <qsizepolicy.h>
00032 #include <qstring.h>
00033 #include <qwidget.h>
00034 #include <qwhatsthis.h>
00035
00036 #include <klocale.h>
00037 #include <kwinmodule.h>
00038
00039 #include "edittaskdialog.h"
00040 #include "ktimewidget.h"
00041 #include "kdebug.h"
00042
00043 EditTaskDialog::EditTaskDialog( QString caption, bool editDlg,
00044 DesktopList* desktopList)
00045 : KDialogBase(0, "EditTaskDialog", true, caption, Ok|Cancel, Ok, true ),
00046 origTime( 0 ), origSession( 0 )
00047 {
00048 QWidget *page = new QWidget( this );
00049 setMainWidget(page);
00050 KWinModule kwinmodule(0, KWinModule::INFO_DESKTOP);
00051
00052 QVBoxLayout *lay1 = new QVBoxLayout(page);
00053
00054 QHBoxLayout *lay2 = new QHBoxLayout();
00055 lay1->addLayout(lay2);
00056
00057
00058 QLabel *label = new QLabel( i18n("Task &name:"), page, "name" );
00059 lay2->addWidget( label );
00060 lay2->addSpacing(5);
00061
00062
00063 _name = new QLineEdit( page, "lineedit" );
00064
00065 _name->setMinimumWidth(fontMetrics().maxWidth()*15);
00066 lay2->addWidget( _name );
00067 label->setBuddy( _name );
00068
00069
00070
00071 lay1->addSpacing(10);lay1->addStretch(1);
00072 _absoluteRB = new QRadioButton( i18n( "Edit &absolute" ), page,
00073 "_absoluteRB" );
00074 lay1->addWidget( _absoluteRB );
00075 connect( _absoluteRB, SIGNAL( clicked() ), this, SLOT( slotAbsolutePressed() ) );
00076
00077
00078
00079 QHBoxLayout *lay5 = new QHBoxLayout();
00080 lay1->addLayout(lay5);
00081 lay5->addSpacing(20);
00082 QGridLayout *lay3 = new QGridLayout( 2, 2, -1, "lay3" );
00083 lay5->addLayout(lay3);
00084
00085 _sessionLA = new QLabel( i18n("&Session time: "), page, "session time" );
00086
00087
00088 _timeLA = new QLabel( i18n("&Time:"), page, "time" );
00089 lay3->addWidget( _timeLA, 0, 0 );
00090 _timeLA->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1,
00091 (QSizePolicy::SizeType)0,
00092 0,
00093 0,
00094 _timeLA->sizePolicy().hasHeightForWidth()) );
00095
00096
00097
00098
00099
00100 _timeLA->setMinimumWidth( fontMetrics().width( _sessionLA->text() ) );
00101
00102 _timeTW = new KArmTimeWidget( page, "_timeTW" );
00103 lay3->addWidget( _timeTW, 0, 1 );
00104 _timeLA->setBuddy( _timeTW );
00105
00106
00107
00108 lay3->addWidget( _sessionLA, 1, 0 );
00109
00110 _sessionTW = new KArmTimeWidget( page, "_sessionTW" );
00111 lay3->addWidget( _sessionTW, 1, 1 );
00112 _sessionLA->setBuddy( _sessionTW );
00113 _sessionLA->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1,
00114 (QSizePolicy::SizeType)0,
00115 0,
00116 0,
00117 _sessionLA->sizePolicy().hasHeightForWidth()) );
00118 _sessionLA->setMinimumWidth( fontMetrics().width( _sessionLA->text() ) );
00119
00120
00121
00122 lay1->addSpacing(10);
00123 lay1->addStretch(1);
00124 _relativeRB = new QRadioButton( i18n( "Edit &relative (apply to both time and"
00125 " session time)" ), page, "_relativeRB" );
00126 lay1->addWidget( _relativeRB );
00127 connect( _relativeRB, SIGNAL( clicked() ), this, SLOT(slotRelativePressed()) );
00128
00129
00130 QHBoxLayout *lay4 = new QHBoxLayout();
00131 lay1->addLayout( lay4 );
00132 lay4->addSpacing(20);
00133
00134 _operator = new QComboBox(page);
00135 _operator->insertItem( QString::fromLatin1( "+" ) );
00136 _operator->insertItem( QString::fromLatin1( "-" ) );
00137 _operator->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1,
00138 (QSizePolicy::SizeType)0,
00139 0,
00140 0,
00141 _operator->sizePolicy().hasHeightForWidth()) );
00142
00143 _operator->setMinimumWidth( fontMetrics().width( _sessionLA->text() ) );
00144 lay4->addWidget( _operator );
00145
00146 _diffTW = new KArmTimeWidget( page, "_sessionAddTW" );
00147 lay4->addWidget( _diffTW );
00148
00149 desktopCount = kwinmodule.numberOfDesktops();
00150
00151
00152
00153
00154 if ( (desktopList != 0) && (desktopList->size() > 0) )
00155 {
00156 DesktopList::iterator rit = desktopList->begin();
00157 while (*rit < desktopCount && rit!=desktopList->end())
00158 {
00159 ++rit;
00160 }
00161 desktopList->erase(rit, desktopList->end());
00162 }
00163
00164
00165 lay1->addSpacing(10);
00166 lay1->addStretch(1);
00167
00168 _desktopCB = new QCheckBox(i18n("A&uto tracking"), page);
00169 _desktopCB->setEnabled(true);
00170 lay1->addWidget(_desktopCB);
00171
00172 QGroupBox* groupBox;
00173 {
00174 int lines = (int)(desktopCount/2);
00175 if (lines*2 != desktopCount) lines++;
00176 groupBox = new QButtonGroup( lines, QGroupBox::Horizontal,
00177 i18n("In Desktop"), page, "_desktopsGB");
00178 }
00179 lay1->addWidget(groupBox);
00180
00181 QHBoxLayout *lay6 = new QHBoxLayout();
00182
00183 lay1->addLayout(lay6);
00184 for (int i=0; i<desktopCount; i++) {
00185 _deskBox.push_back(new QCheckBox(groupBox,QString::number(i).latin1()));
00186 _deskBox[i]->setText(kwinmodule.desktopName(i+1));
00187 _deskBox[i]->setChecked(false);
00188
00189 lay6->addWidget(_deskBox[i]);
00190 }
00191
00192 bool enableDesktops = false;
00193
00194 if ( (desktopList != 0) && (desktopList->size() > 0) )
00195 {
00196 DesktopList::iterator it = desktopList->begin();
00197 while (it != desktopList->end())
00198 {
00199 _deskBox[*it]->setChecked(true);
00200 it++;
00201 }
00202 enableDesktops = true;
00203 }
00204
00205 _desktopCB->setChecked(enableDesktops);
00206
00207 for (int i=0; i<desktopCount; i++)
00208 _deskBox[i]->setEnabled(enableDesktops);
00209
00210 connect(_desktopCB, SIGNAL(clicked()), this, SLOT(slotAutoTrackingPressed()));
00211
00212 lay1->addStretch(1);
00213
00214
00215 if ( editDlg ) {
00216
00217 _operator->setFocus();
00218 }
00219 else {
00220
00221 _name->setFocus();
00222 }
00223
00224 slotRelativePressed();
00225
00226
00227 QWhatsThis::add( _name,
00228 i18n( "Enter the name of the task here. "
00229 "This name is for your eyes only."));
00230 QWhatsThis::add( _absoluteRB,
00231 i18n( "Use this option to set the time spent on this task "
00232 "to an absolute value.\n\nFor example, if you have "
00233 "worked exactly four hours on this task during the current "
00234 "session, you would set the Session time to 4 hr." ) );
00235 QWhatsThis::add( _relativeRB,
00236 i18n( "Use this option to change the time spent on this task "
00237 "relative to its current value.\n\nFor example, if you worked "
00238 "on this task for one hour without the timer running, you "
00239 "would add 1 hr." ) );
00240 QWhatsThis::add( _timeTW,
00241 i18n( "This is the time the task has been "
00242 "running since all times were reset."));
00243 QWhatsThis::add( _sessionTW,
00244 i18n( "This is the time the task has been running this "
00245 "session."));
00246 QWhatsThis::add( _diffTW, i18n( "Specify how much time to add or subtract "
00247 "to the overall and session time"));
00248
00249 QWhatsThis::add( _desktopCB,
00250 i18n( "Use this option to automatically start the timer "
00251 "on this task when you switch to the specified desktop(s)." ) );
00252 QWhatsThis::add( groupBox,
00253 i18n( "Select the desktop(s) that will automatically start the "
00254 "timer on this task." ) );
00255 }
00256
00257
00258 void EditTaskDialog::slotAbsolutePressed()
00259 {
00260 _relativeRB->setChecked( false );
00261 _absoluteRB->setChecked( true );
00262
00263 _operator->setEnabled( false );
00264 _diffTW->setEnabled( false );
00265
00266 _timeLA->setEnabled( true );
00267 _sessionLA->setEnabled( true );
00268 _timeTW->setEnabled( true );
00269 _sessionTW->setEnabled( true );
00270 }
00271
00272 void EditTaskDialog::slotRelativePressed()
00273 {
00274 _relativeRB->setChecked( true );
00275 _absoluteRB->setChecked( false );
00276
00277 _operator->setEnabled( true );
00278 _diffTW->setEnabled( true );
00279
00280 _timeLA->setEnabled( false );
00281 _sessionLA->setEnabled( false );
00282 _timeTW->setEnabled( false );
00283 _sessionTW->setEnabled( false );
00284 }
00285
00286 void EditTaskDialog::slotAutoTrackingPressed()
00287 {
00288 bool checked = _desktopCB->isChecked();
00289 for (unsigned int i=0; i<_deskBox.size(); i++)
00290 _deskBox[i]->setEnabled(checked);
00291
00292 if (!checked)
00293 for (int i=0; i<desktopCount; i++)
00294 _deskBox[i]->setChecked(false);
00295 }
00296
00297 void EditTaskDialog::setTask( const QString &name, long time, long session )
00298 {
00299 _name->setText( name );
00300
00301 _timeTW->setTime( time / 60, time % 60 );
00302 _sessionTW->setTime( session / 60, session % 60 );
00303 origTime = time;
00304 origSession = session;
00305 }
00306
00307
00308 QString EditTaskDialog::taskName() const
00309 {
00310 return( _name->text() );
00311 }
00312
00313
00314 void EditTaskDialog::status(long *time, long *timeDiff, long *session,
00315 long *sessionDiff, DesktopList *desktopList) const
00316 {
00317 if ( _absoluteRB->isChecked() ) {
00318 *time = _timeTW->time();
00319 *session = _sessionTW->time();
00320 }
00321 else {
00322 int diff = _diffTW->time();
00323 if ( _operator->currentItem() == 1) {
00324 diff = -diff;
00325 }
00326 *time = origTime + diff;
00327 *session = origSession + diff;
00328 }
00329
00330 *timeDiff = *time - origTime;
00331 *sessionDiff = *session - origSession;
00332
00333 for (unsigned int i=0; i<_deskBox.size(); i++) {
00334 if (_deskBox[i]->isChecked())
00335 desktopList->push_back(i);
00336 }
00337 }
00338
00339 #include "edittaskdialog.moc"