karm Library API Documentation

edittaskdialog.cpp

00001 /* 00002 * karm 00003 * This file only: Copyright (C) 1999 Espen Sand, espensa@online.no 00004 * Modifications (see CVS log) Copyright (C) 2000 Klarälvdalens 00005 * Datakonsult AB <kalle@dalheimer.de>, Jesper Pedersen <blackie@kde.org> 00006 * 00007 * 00008 * This program is free software; you can redistribute it and/or modify 00009 * it under the terms of the GNU General Public License as published by 00010 * the Free Software Foundation; either version 2 of the License, or 00011 * (at your option) any later version. 00012 * 00013 * This program is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 * GNU General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU General Public License 00019 * along with this program; if not, write to the Free Software 00020 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 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> // i18n 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 // The name of the widget 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 // The "Edit Absolut" radio button 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 // Absolute times 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 // Time 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 // Based on measuring pixels in a screenshot, it looks like the fontmetrics 00097 // call includes the ampersand when calculating the width. To be sure 00098 // things will line up (no matter what language or widget style), set all 00099 // three date entry label controls to the same width. 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 // Session 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 // The "Edit relative" radio button 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 // The relative times 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 //kdDebug() << "text width=" << fontMetrics().width( _sessionLA->text() ) << endl; 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 // If desktopList contains higher numbered desktops than desktopCount then 00152 // delete those from desktopList. This may be the case if the user has 00153 // configured virtual desktops. The values in desktopList are sorted. 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 // The "Choose Desktop" checkbox 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 // check specified Desktop Check Boxes 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 // if some desktops were specified, then enable the parent box 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 // This is an edit dialog. 00217 _operator->setFocus(); 00218 } 00219 else { 00220 // This is an initial dialog 00221 _name->setFocus(); 00222 } 00223 00224 slotRelativePressed(); 00225 00226 // Whats this help. 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) // uncheck all desktop boxes 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"
KDE Logo
This file is part of the documentation for karm Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Oct 21 19:46:33 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003