kalarm/lib

timeedit.cpp
1 /*
2  * timeedit.cpp - time-of-day edit widget, with AM/PM shown depending on locale
3  * Program: kalarm
4  * Copyright (C) 2004 by David Jarvie <software@astrojar.org.uk>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  */
20 
21 #include "kalarm.h"
22 
23 #include <tdeglobal.h>
24 #include <tdelocale.h>
25 
26 #include "combobox.h"
27 #include "timespinbox.h"
28 #include "timeedit.moc"
29 
30 
31 TimeEdit::TimeEdit(TQWidget* parent, const char* name)
32  : TQHBox(parent, name),
33  mAmPm(0),
34  mAmIndex(-1),
35  mPmIndex(-1),
36  mReadOnly(false)
37 {
38  bool use12hour = TDEGlobal::locale()->use12Clock();
39  mSpinBox = new TimeSpinBox(!use12hour, this);
40  mSpinBox->setFixedSize(mSpinBox->sizeHint());
41  connect(mSpinBox, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(slotValueChanged(int)));
42  if (use12hour)
43  {
44  mAmPm = new ComboBox(this);
45  setAmPmCombo(1, 1); // add "am" and "pm" options to the combo box
46  mAmPm->setFixedSize(mAmPm->sizeHint());
47  connect(mAmPm, TQ_SIGNAL(highlighted(int)), TQ_SLOT(slotAmPmChanged(int)));
48  }
49 }
50 
51 void TimeEdit::setReadOnly(bool ro)
52 {
53  if (ro != mReadOnly)
54  {
55  mReadOnly = ro;
56  mSpinBox->setReadOnly(ro);
57  if (mAmPm)
58  mAmPm->setReadOnly(ro);
59  }
60 }
61 
62 int TimeEdit::value() const
63 {
64  return mSpinBox->value();
65 }
66 
67 bool TimeEdit::isValid() const
68 {
69  return mSpinBox->isValid();
70 }
71 
72 /******************************************************************************
73  * Set the edit value as valid or invalid.
74  * If newly invalid, the value is displayed as asterisks.
75  * If newly valid, the value is set to the minimum value.
76  */
77 void TimeEdit::setValid(bool valid)
78 {
79  bool oldValid = mSpinBox->isValid();
80  if ((valid && !oldValid) || (!valid && oldValid))
81  {
82  mSpinBox->setValid(valid);
83  if (mAmPm)
84  mAmPm->setCurrentItem(0);
85  }
86 }
87 
88 /******************************************************************************
89  * Set the widget's value.
90  */
91 void TimeEdit::setValue(int minutes)
92 {
93  if (mAmPm)
94  {
95  int i = (minutes >= 720) ? mPmIndex : mAmIndex;
96  mAmPm->setCurrentItem(i >= 0 ? i : 0);
97  }
98  mSpinBox->setValue(minutes);
99 }
100 
101 bool TimeEdit::wrapping() const
102 {
103  return mSpinBox->wrapping();
104 }
105 
107 {
108  mSpinBox->setWrapping(on);
109 }
110 
112 {
113  return mSpinBox->minValue();
114 }
115 
117 {
118  return mSpinBox->maxValue();
119 }
120 
121 void TimeEdit::setMinValue(int minutes)
122 {
123  if (mAmPm)
124  setAmPmCombo((minutes < 720 ? 1 : 0), -1); // insert/remove "am" in combo box
125  mSpinBox->setMinValue(minutes);
126 }
127 
128 void TimeEdit::setMaxValue(int minutes)
129 {
130  if (mAmPm)
131  setAmPmCombo(-1, (minutes < 720 ? 0 : 1)); // insert/remove "pm" in combo box
132  mSpinBox->setMaxValue(minutes);
133 }
134 
135 /******************************************************************************
136  * Called when the spin box value has changed.
137  */
138 void TimeEdit::slotValueChanged(int value)
139 {
140  if (mAmPm)
141  {
142  bool pm = (mAmPm->currentItem() == mPmIndex);
143  if (pm && value < 720)
144  mAmPm->setCurrentItem(mAmIndex);
145  else if (!pm && value >= 720)
146  mAmPm->setCurrentItem(mPmIndex);
147  }
148  emit valueChanged(value);
149 }
150 
151 /******************************************************************************
152  * Called when a new selection has been made by the user in the AM/PM combo box.
153  * Adjust the current time value by 12 hours.
154  */
155 void TimeEdit::slotAmPmChanged(int item)
156 {
157  if (mAmPm)
158  {
159  int value = mSpinBox->value();
160  if (item == mPmIndex && value < 720)
161  mSpinBox->setValue(value + 720);
162  else if (item != mPmIndex && value >= 720)
163  mSpinBox->setValue(value - 720);
164  }
165 }
166 
167 /******************************************************************************
168  * Set up the AM/PM combo box to contain the specified items.
169  */
170 void TimeEdit::setAmPmCombo(int am, int pm)
171 {
172  if (am > 0 && mAmIndex < 0)
173  {
174  // Insert "am"
175  mAmIndex = 0;
176  mAmPm->insertItem(TDEGlobal::locale()->translate("am"), mAmIndex);
177  if (mPmIndex >= 0)
178  mPmIndex = 1;
179  mAmPm->setCurrentItem(mPmIndex >= 0 ? mPmIndex : mAmIndex);
180  }
181  else if (am == 0 && mAmIndex >= 0)
182  {
183  // Remove "am"
184  mAmPm->removeItem(mAmIndex);
185  mAmIndex = -1;
186  if (mPmIndex >= 0)
187  mPmIndex = 0;
188  mAmPm->setCurrentItem(mPmIndex);
189  }
190 
191  if (pm > 0 && mPmIndex < 0)
192  {
193  // Insert "pm"
194  mPmIndex = mAmIndex + 1;
195  mAmPm->insertItem(TDEGlobal::locale()->translate("pm"), mPmIndex);
196  if (mAmIndex < 0)
197  mAmPm->setCurrentItem(mPmIndex);
198  }
199  else if (pm == 0 && mPmIndex >= 0)
200  {
201  // Remove "pm"
202  mAmPm->removeItem(mPmIndex);
203  mPmIndex = -1;
204  mAmPm->setCurrentItem(mAmIndex);
205  }
206 }
virtual void setReadOnly(bool readOnly)
Sets whether the spin box can be changed by the user.
Definition: spinbox2.cpp:99
virtual void setValue(int minutes)
Sets the value of the widget.
Definition: timeedit.cpp:91
TimeEdit(TQWidget *parent=0, const char *name=0)
Constructor.
Definition: timeedit.cpp:31
int minValue() const
Returns the minimum value of the spin box.
Definition: spinbox2.h:138
virtual void setMaxValue(int minutes)
Sets the maximum value which can be held in the spin box.
Definition: timespinbox.h:84
void setValid(bool)
Sets the spin box as holding a valid or invalid value.
bool isValid() const
Returns true if the spin box holds a valid value.
void setValid(bool valid)
Sets whether the edit value is valid.
Definition: timeedit.cpp:77
A TQComboBox with read-only option.
Definition: combobox.h:37
virtual void setMinValue(int minutes)
Sets the maximum value which can be held in the spin box.
int maxValue() const
Returns the maximum value of the widget in minutes.
Definition: timeedit.cpp:116
virtual void setWrapping(bool on)
Sets whether it is possible to step the value from the highest value to the lowest value and vice ver...
Definition: spinbox2.cpp:125
int value() const
Returns the entered time as a value in minutes.
Definition: timeedit.cpp:62
int maxValue() const
Returns the maximum value of the spin box.
Definition: spinbox2.h:140
void setMaxValue(int minutes)
Sets the maximum value of the widget.
Definition: timeedit.cpp:128
void setWrapping(bool on)
Sets whether it is possible to step the value from the highest value to the lowest value and vice ver...
Definition: timeedit.cpp:106
Hours/minutes time entry widget.
Definition: timespinbox.h:45
int value() const
Returns the current value of the spin box.
Definition: spinbox2.h:148
bool isValid() const
Returns true if the widget contains a valid value.
Definition: timeedit.cpp:67
virtual void setReadOnly(bool readOnly)
Sets whether the widget is read-only for the user.
Definition: timeedit.cpp:51
virtual void setValue(int minutes)
Sets the value of the spin box.
int minValue() const
Returns the minimum value of the widget in minutes.
Definition: timeedit.cpp:111
virtual void setReadOnly(bool readOnly)
Sets whether the combo box is read-only for the user.
Definition: combobox.cpp:35
void setMinValue(int minutes)
Sets the minimum value of the widget.
Definition: timeedit.cpp:121
bool wrapping() const
Returns true if it is possible to step the value from the highest value to the lowest value and vice ...
Definition: timeedit.cpp:101
bool wrapping() const
Returns whether it is possible to step the value from the highest value to the lowest value and vice ...
Definition: spinbox2.h:116
void valueChanged(int minutes)
This signal is emitted every time the value of the widget changes (for whatever reason).