Updated French translation
[timedsilencer] / newalarmdlg.cpp
1 /*
2  * This file is part of TimedSilencer.
3  *
4  *  TimedSilencer is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation, either version 3 of the License, or
7  *  (at your option) any later version.
8  *
9  *  TimedSilencer is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with TimedSilencer.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include <QHBoxLayout>
19 #include <QVBoxLayout>
20 #include <QDialogButtonBox>
21 #include <QLabel>
22 #include <QPushButton>
23 #include <QAbstractButton>
24 #include <QSettings>
25 #include <QCheckBox>
26 #include <QMaemo5ValueButton>
27 #include <QMaemo5TimePickSelector>
28 #include <QMaemo5InformationBox>
29 #include "newalarmdlg.h"
30 #include "alarmd_backend.h"
31 #include "qmaemo5weekdayspickselector.h"
32 #include "profileevent.h"
33
34 NewAlarmDlg::NewAlarmDlg(QWidget *parent, QByteArray edited_id) :
35     QDialog(parent)
36 {
37   if(!edited_id.isNull()) {
38     pe = ProfileEvent::findByID(edited_id);
39   } else {
40     pe = 0;
41   }
42   if(pe) {
43     setWindowTitle(tr("Edit profile switching event"));
44   } else {
45     setWindowTitle(tr("New profile switching event"));
46   }
47   QHBoxLayout *hori_layout = new QHBoxLayout(this);
48   QVBoxLayout *verticalLayoutL = new QVBoxLayout();
49   verticalLayoutL->addWidget(new QLabel(tr("Use the silent profile")));
50   from_button = new QMaemo5ValueButton(tr("From"));
51   QMaemo5TimePickSelector *from_selector = new QMaemo5TimePickSelector();
52   if(pe) {
53     from_selector->setCurrentTime(pe->from_time);
54   } else {
55     from_selector->setCurrentTime(QTime(22, 30));
56   }
57   from_button->setPickSelector(from_selector);
58   from_button->setValueLayout(QMaemo5ValueButton::ValueBesideText);
59   verticalLayoutL->addWidget(from_button);
60   to_button = new QMaemo5ValueButton(tr("To"));
61   QMaemo5TimePickSelector *to_selector = new QMaemo5TimePickSelector();
62   if(pe) {
63     to_selector->setCurrentTime(pe->to_time);
64   } else {
65     to_selector->setCurrentTime(QTime(8, 0));
66   }
67   to_button->setPickSelector(to_selector);
68   to_button->setValueLayout(QMaemo5ValueButton::ValueBesideText);
69   verticalLayoutL->addWidget(to_button);
70   // Status
71   //verticalLayoutL->addItem(new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding));
72   repeat_button = new QMaemo5ValueButton(tr("Repeat"));
73   repeat_button->setValueLayout(QMaemo5ValueButton::ValueBesideText);
74   QMaemo5WeekDaysPickSelector *weekDaysSelector = new QMaemo5WeekDaysPickSelector;
75   if(pe) {
76     weekDaysSelector->updateSelection(pe->days);
77   }
78   repeat_button->setPickSelector(weekDaysSelector);
79   verticalLayoutL->addWidget(repeat_button);
80   if(pe) {
81     cb_enable = new QCheckBox(tr("Activated"));
82     cb_enable->setChecked(pe->activated);
83     verticalLayoutL->addWidget(cb_enable);
84   } else {
85     cb_enable = 0;
86   }
87   hori_layout->addLayout(verticalLayoutL);
88   QVBoxLayout *verticalLayoutR = new QVBoxLayout;
89   verticalLayoutR->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding));
90   button_box = new QDialogButtonBox(Qt::Vertical);
91   // Delete button
92   if(pe) {
93     delete_btn = new QPushButton(tr("Delete"));
94     connect(delete_btn, SIGNAL(clicked()), this, SLOT(deleteAndClose()));
95     button_box->addButton(delete_btn, QDialogButtonBox::ActionRole);
96   } else {
97     delete_btn = 0;
98   }
99   // Save button
100   done_btn = new QPushButton(tr("Save"));
101   connect(done_btn, SIGNAL(clicked()), this, SLOT(saveAndClose()));
102   button_box->addButton(done_btn, QDialogButtonBox::ActionRole);
103   verticalLayoutR->addWidget(button_box);
104   hori_layout->addLayout(verticalLayoutR);
105 }
106
107 NewAlarmDlg::~NewAlarmDlg() {
108   if(pe) delete pe;
109   delete button_box;
110 }
111
112 void NewAlarmDlg::saveAndClose() {
113   // Save QSettings
114   ProfileEvent *new_pe = saveEvent();
115   if(new_pe) {
116     // Update Alarmd events
117     if(pe && pe->activated) {
118       // Delete old alarmd events
119       AlarmdBackend::deleteEvents(pe);
120     }
121     if(new_pe->activated) {
122       // Add new alarmd events
123       AlarmdBackend::setProfileEvents(new_pe);
124     }
125     delete new_pe;
126   }
127   // Close the window
128   close();
129 }
130
131 void NewAlarmDlg::deleteAndClose() {
132   Q_ASSERT(pe);
133   // Remove Alarmd events
134   AlarmdBackend::deleteEvents(pe);
135   // Update QSettings
136   QSettings settings("TimedSilencer", "TimedSilencer");
137   QHash<QString, QVariant> events = settings.value("events").toHash();
138   Q_ASSERT(events.contains(pe->getID()));
139   events.remove(pe->getID());
140   settings.setValue("events", events);
141   // Notify MainWindow
142   emit deletedEvent(pe->getID());
143   close();
144 }
145
146 ProfileEvent* NewAlarmDlg::saveEvent() {
147   QSettings settings("TimedSilencer", "TimedSilencer");
148   ProfileEvent *new_pe = new ProfileEvent;
149   new_pe->from_time = static_cast<QMaemo5TimePickSelector*>(from_button->pickSelector())->currentTime();
150   new_pe->to_time = static_cast<QMaemo5TimePickSelector*>(to_button->pickSelector())->currentTime();
151   new_pe->days = static_cast<QMaemo5WeekDaysPickSelector*>(repeat_button->pickSelector())->selectedDays();
152   if(cb_enable)
153     new_pe->activated = cb_enable->isChecked();
154   QHash<QString, QVariant> events = settings.value("events").toHash();
155   if(pe && new_pe->getID() != pe->getID()) {
156     events.remove(pe->getID());
157   }
158   // Save
159   qDebug("Saving event...");
160   QVariant var_pe = new_pe->save();
161   if(pe) {
162     if(pe->getID() == new_pe->getID()) {
163       qDebug("ID did not change");
164       if(pe->activated != new_pe->activated) {
165         // Only the activated status may change without altering the ID
166         emit editedEvent(new_pe->getID(), new_pe->activated);
167       }
168     } else {
169       qDebug("ID changed");
170       emit deletedEvent(pe->getID());
171       emit newEvent(var_pe);
172     }
173   } else {
174     qDebug("New event");
175     if(events.contains(new_pe->getID())) {
176       QMaemo5InformationBox::information(parentWidget(), tr("This profile switching event already exists"));
177       return 0;
178     } else {
179       emit newEvent(var_pe);
180     }
181   }
182   events.insert(new_pe->getID(), var_pe);
183   settings.setValue("events", events);
184   return new_pe;
185 }