You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/karm/edittaskdialog.cpp

340 lines
11 KiB

/*
* karm
* This file only: Copyright (C) 1999 Espen Sand, espensa@online.no
* Modifications (see CVS log) Copyright (C) 2000 Klarälvdalens
* Datakonsult AB <kalle@dalheimer.de>, Jesper Pedersen <blackie@kde.org>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include <qbuttongroup.h>
#include <qcombobox.h>
#include <qgroupbox.h>
#include <qhbox.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qlineedit.h>
#include <qradiobutton.h>
#include <qsizepolicy.h>
#include <qstring.h>
#include <qwidget.h>
#include <qwhatsthis.h>
#include <klocale.h> // i18n
#include <kwinmodule.h>
#include "edittaskdialog.h"
#include "ktimewidget.h"
#include "kdebug.h"
EditTaskDialog::EditTaskDialog( QString caption, bool editDlg,
DesktopList* desktopList)
: KDialogBase(0, "EditTaskDialog", true, caption, Ok|Cancel, Ok, true ),
origTime( 0 ), origSession( 0 )
{
QWidget *page = new QWidget( this );
setMainWidget(page);
KWinModule kwinmodule(0, KWinModule::INFO_DESKTOP);
QVBoxLayout *lay1 = new QVBoxLayout(page);
QHBoxLayout *lay2 = new QHBoxLayout();
lay1->addLayout(lay2);
// The name of the widget
QLabel *label = new QLabel( i18n("Task &name:"), page, "name" );
lay2->addWidget( label );
lay2->addSpacing(5);
_name = new QLineEdit( page, "lineedit" );
_name->setMinimumWidth(fontMetrics().maxWidth()*15);
lay2->addWidget( _name );
label->setBuddy( _name );
// The "Edit Absolut" radio button
lay1->addSpacing(10);lay1->addStretch(1);
_absoluteRB = new QRadioButton( i18n( "Edit &absolute" ), page,
"_absoluteRB" );
lay1->addWidget( _absoluteRB );
connect( _absoluteRB, SIGNAL( clicked() ), this, SLOT( slotAbsolutePressed() ) );
// Absolute times
QHBoxLayout *lay5 = new QHBoxLayout();
lay1->addLayout(lay5);
lay5->addSpacing(20);
QGridLayout *lay3 = new QGridLayout( 2, 2, -1, "lay3" );
lay5->addLayout(lay3);
_sessionLA = new QLabel( i18n("&Session time: "), page, "session time" );
// Time
_timeLA = new QLabel( i18n("&Time:"), page, "time" );
lay3->addWidget( _timeLA, 0, 0 );
_timeLA->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1,
(QSizePolicy::SizeType)0,
0,
0,
_timeLA->sizePolicy().hasHeightForWidth()) );
// Based on measuring pixels in a screenshot, it looks like the fontmetrics
// call includes the ampersand when calculating the width. To be sure
// things will line up (no matter what language or widget style), set all
// three date entry label controls to the same width.
_timeLA->setMinimumWidth( fontMetrics().width( _sessionLA->text() ) );
_timeTW = new KArmTimeWidget( page, "_timeTW" );
lay3->addWidget( _timeTW, 0, 1 );
_timeLA->setBuddy( _timeTW );
// Session
lay3->addWidget( _sessionLA, 1, 0 );
_sessionTW = new KArmTimeWidget( page, "_sessionTW" );
lay3->addWidget( _sessionTW, 1, 1 );
_sessionLA->setBuddy( _sessionTW );
_sessionLA->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1,
(QSizePolicy::SizeType)0,
0,
0,
_sessionLA->sizePolicy().hasHeightForWidth()) );
_sessionLA->setMinimumWidth( fontMetrics().width( _sessionLA->text() ) );
// The "Edit relative" radio button
lay1->addSpacing(10);
lay1->addStretch(1);
_relativeRB = new QRadioButton( i18n( "Edit &relative (apply to both time and"
" session time)" ), page, "_relativeRB" );
lay1->addWidget( _relativeRB );
connect( _relativeRB, SIGNAL( clicked() ), this, SLOT(slotRelativePressed()) );
// The relative times
QHBoxLayout *lay4 = new QHBoxLayout();
lay1->addLayout( lay4 );
lay4->addSpacing(20);
_operator = new QComboBox(page);
_operator->insertItem( QString::fromLatin1( "+" ) );
_operator->insertItem( QString::fromLatin1( "-" ) );
_operator->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1,
(QSizePolicy::SizeType)0,
0,
0,
_operator->sizePolicy().hasHeightForWidth()) );
//kdDebug() << "text width=" << fontMetrics().width( _sessionLA->text() ) << endl;
_operator->setMinimumWidth( fontMetrics().width( _sessionLA->text() ) );
lay4->addWidget( _operator );
_diffTW = new KArmTimeWidget( page, "_sessionAddTW" );
lay4->addWidget( _diffTW );
desktopCount = kwinmodule.numberOfDesktops();
// If desktopList contains higher numbered desktops than desktopCount then
// delete those from desktopList. This may be the case if the user has
// configured virtual desktops. The values in desktopList are sorted.
if ( (desktopList != 0) && (desktopList->size() > 0) )
{
DesktopList::iterator rit = desktopList->begin();
while (*rit < desktopCount && rit!=desktopList->end())
{
++rit;
}
desktopList->erase(rit, desktopList->end());
}
// The "Choose Desktop" checkbox
lay1->addSpacing(10);
lay1->addStretch(1);
_desktopCB = new QCheckBox(i18n("A&uto tracking"), page);
_desktopCB->setEnabled(true);
lay1->addWidget(_desktopCB);
QGroupBox* groupBox;
{
int lines = (int)(desktopCount/2);
if (lines*2 != desktopCount) lines++;
groupBox = new QButtonGroup( lines, QGroupBox::Horizontal,
i18n("In Desktop"), page, "_desktopsGB");
}
lay1->addWidget(groupBox);
QHBoxLayout *lay6 = new QHBoxLayout();
lay1->addLayout(lay6);
for (int i=0; i<desktopCount; i++) {
_deskBox.push_back(new QCheckBox(groupBox,QString::number(i).latin1()));
_deskBox[i]->setText(kwinmodule.desktopName(i+1));
_deskBox[i]->setChecked(false);
lay6->addWidget(_deskBox[i]);
}
// check specified Desktop Check Boxes
bool enableDesktops = false;
if ( (desktopList != 0) && (desktopList->size() > 0) )
{
DesktopList::iterator it = desktopList->begin();
while (it != desktopList->end())
{
_deskBox[*it]->setChecked(true);
it++;
}
enableDesktops = true;
}
// if some desktops were specified, then enable the parent box
_desktopCB->setChecked(enableDesktops);
for (int i=0; i<desktopCount; i++)
_deskBox[i]->setEnabled(enableDesktops);
connect(_desktopCB, SIGNAL(clicked()), this, SLOT(slotAutoTrackingPressed()));
lay1->addStretch(1);
if ( editDlg ) {
// This is an edit dialog.
_operator->setFocus();
}
else {
// This is an initial dialog
_name->setFocus();
}
slotRelativePressed();
// Whats this help.
QWhatsThis::add( _name,
i18n( "Enter the name of the task here. "
"This name is for your eyes only."));
QWhatsThis::add( _absoluteRB,
i18n( "Use this option to set the time spent on this task "
"to an absolute value.\n\nFor example, if you have "
"worked exactly four hours on this task during the current "
"session, you would set the Session time to 4 hr." ) );
QWhatsThis::add( _relativeRB,
i18n( "Use this option to change the time spent on this task "
"relative to its current value.\n\nFor example, if you worked "
"on this task for one hour without the timer running, you "
"would add 1 hr." ) );
QWhatsThis::add( _timeTW,
i18n( "This is the time the task has been "
"running since all times were reset."));
QWhatsThis::add( _sessionTW,
i18n( "This is the time the task has been running this "
"session."));
QWhatsThis::add( _diffTW, i18n( "Specify how much time to add or subtract "
"to the overall and session time"));
QWhatsThis::add( _desktopCB,
i18n( "Use this option to automatically start the timer "
"on this task when you switch to the specified desktop(s)." ) );
QWhatsThis::add( groupBox,
i18n( "Select the desktop(s) that will automatically start the "
"timer on this task." ) );
}
void EditTaskDialog::slotAbsolutePressed()
{
_relativeRB->setChecked( false );
_absoluteRB->setChecked( true );
_operator->setEnabled( false );
_diffTW->setEnabled( false );
_timeLA->setEnabled( true );
_sessionLA->setEnabled( true );
_timeTW->setEnabled( true );
_sessionTW->setEnabled( true );
}
void EditTaskDialog::slotRelativePressed()
{
_relativeRB->setChecked( true );
_absoluteRB->setChecked( false );
_operator->setEnabled( true );
_diffTW->setEnabled( true );
_timeLA->setEnabled( false );
_sessionLA->setEnabled( false );
_timeTW->setEnabled( false );
_sessionTW->setEnabled( false );
}
void EditTaskDialog::slotAutoTrackingPressed()
{
bool checked = _desktopCB->isChecked();
for (unsigned int i=0; i<_deskBox.size(); i++)
_deskBox[i]->setEnabled(checked);
if (!checked) // uncheck all desktop boxes
for (int i=0; i<desktopCount; i++)
_deskBox[i]->setChecked(false);
}
void EditTaskDialog::setTask( const QString &name, long time, long session )
{
_name->setText( name );
_timeTW->setTime( time );
_sessionTW->setTime( session );
origTime = time;
origSession = session;
}
QString EditTaskDialog::taskName() const
{
return( _name->text() );
}
void EditTaskDialog::status(long *time, long *timeDiff, long *session,
long *sessionDiff, DesktopList *desktopList) const
{
if ( _absoluteRB->isChecked() ) {
*time = _timeTW->time();
*session = _sessionTW->time();
}
else {
int diff = _diffTW->time();
if ( _operator->currentItem() == 1) {
diff = -diff;
}
*time = origTime + diff;
*session = origSession + diff;
}
*timeDiff = *time - origTime;
*sessionDiff = *session - origSession;
for (unsigned int i=0; i<_deskBox.size(); i++) {
if (_deskBox[i]->isChecked())
desktopList->push_back(i);
}
}
#include "edittaskdialog.moc"