Eventviews

timescaleconfigdialog.cpp
1/*
2 SPDX-FileCopyrightText: 2007 Bruno Virlet <bruno@virlet.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
5*/
6#include "timescaleconfigdialog.h"
7#include "prefs.h"
8
9#include <KCalUtils/Stringify>
10
11#include <KLocalizedString>
12
13#include <QDialogButtonBox>
14#include <QIcon>
15#include <QPushButton>
16#include <QTimeZone>
17#include <QVBoxLayout>
18
19using namespace EventViews;
20
21class EventViews::TimeScaleConfigDialogPrivate
22{
23public:
24 TimeScaleConfigDialogPrivate(TimeScaleConfigDialog *parent, const PrefsPtr &preferences)
25 : q(parent)
26 , mPreferences(preferences)
27 {
28 }
29
30public:
31 TimeScaleConfigDialog *const q;
32 PrefsPtr mPreferences;
33};
34
35enum { TimeZoneNameRole = Qt::UserRole };
36
37using TimeZoneNamePair = QPair<QString, QByteArray>;
38
39static QString tzWithUTC(const QByteArray &zoneId)
40{
41 auto tz = QTimeZone(zoneId);
42 return QStringLiteral("%1 (%2)").arg(i18n(zoneId.constData()), KCalUtils::Stringify::tzUTCOffsetStr(tz));
43}
44
45TimeScaleConfigDialog::TimeScaleConfigDialog(const PrefsPtr &preferences, QWidget *parent)
46 : QDialog(parent)
47 , d(new TimeScaleConfigDialogPrivate(this, preferences))
48{
49 setWindowTitle(i18nc("@title:window", "Timezone"));
50 auto mainLayout = new QVBoxLayout(this);
51 setModal(true);
52
53 auto mainwidget = new QWidget(this);
54 setupUi(mainwidget);
55
56 mainLayout->addWidget(mainwidget);
57
59 QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
60 okButton->setDefault(true);
62 connect(buttonBox, &QDialogButtonBox::rejected, this, &TimeScaleConfigDialog::reject);
63
64 mainLayout->addWidget(buttonBox);
65
66 QStringList shownTimeZones(QString::fromUtf8(d->mPreferences->timeZone().id()));
67 shownTimeZones += d->mPreferences->timeScaleTimezones();
68 shownTimeZones.removeDuplicates();
69
72 const auto zoneIds = QTimeZone::availableTimeZoneIds();
73 for (const auto &zoneId : std::as_const(zoneIds)) {
74 // do not list timezones already shown
75 if (!shownTimeZones.contains(QString::fromUtf8(zoneId))) {
76 availList.append(TimeZoneNamePair(tzWithUTC(zoneId), zoneId));
77 } else {
78 selList.append(TimeZoneNamePair(tzWithUTC(zoneId), zoneId));
79 }
80 }
81 std::sort(availList.begin(), availList.end());
82
83 for (const TimeZoneNamePair &item : std::as_const(availList)) {
84 zoneCombo->addItem(item.first, item.second);
85 }
86 zoneCombo->setCurrentIndex(0);
87
88 addButton->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
89 removeButton->setIcon(QIcon::fromTheme(QStringLiteral("list-remove")));
90 upButton->setIcon(QIcon::fromTheme(QStringLiteral("go-up")));
91 downButton->setIcon(QIcon::fromTheme(QStringLiteral("go-down")));
92
93 connect(addButton, &QPushButton::clicked, this, &TimeScaleConfigDialog::add);
94 connect(removeButton, &QPushButton::clicked, this, &TimeScaleConfigDialog::remove);
95 connect(upButton, &QPushButton::clicked, this, &TimeScaleConfigDialog::up);
96 connect(downButton, &QPushButton::clicked, this, &TimeScaleConfigDialog::down);
97
98 connect(okButton, &QPushButton::clicked, this, &TimeScaleConfigDialog::okClicked);
99 connect(buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, this, &TimeScaleConfigDialog::reject);
100 connect(listWidget, &QListWidget::currentItemChanged, this, &TimeScaleConfigDialog::slotUpdateButton);
101
102 for (const TimeZoneNamePair &item : std::as_const(selList)) {
103 auto widgetItem = new QListWidgetItem(item.first);
104 widgetItem->setData(TimeZoneNameRole, item.second);
105 listWidget->addItem(widgetItem);
106 }
107 slotUpdateButton();
108}
109
110TimeScaleConfigDialog::~TimeScaleConfigDialog() = default;
111
112void TimeScaleConfigDialog::slotUpdateButton()
113{
114 removeButton->setEnabled(listWidget->currentItem());
115 const bool numberElementMoreThanOneElement = (listWidget->count() > 1);
116 upButton->setEnabled(numberElementMoreThanOneElement && (listWidget->currentRow() >= 1));
117 downButton->setEnabled(numberElementMoreThanOneElement && (listWidget->currentRow() < listWidget->count() - 1));
118}
119
120void TimeScaleConfigDialog::okClicked()
121{
122 d->mPreferences->setTimeScaleTimezones(zones());
123 d->mPreferences->writeConfig();
124 accept();
125}
126
127void TimeScaleConfigDialog::add()
128{
129 // Do not add duplicates
130 if (zoneCombo->currentIndex() >= 0) {
131 const int numberItem(listWidget->count());
132 for (int i = 0; i < numberItem; ++i) {
133 if (listWidget->item(i)->data(TimeZoneNameRole).toString() == zoneCombo->itemData(zoneCombo->currentIndex(), TimeZoneNameRole).toString()) {
134 return;
135 }
136 }
137
138 auto item = new QListWidgetItem(zoneCombo->currentText());
139 item->setData(TimeZoneNameRole, zoneCombo->itemData(zoneCombo->currentIndex(), TimeZoneNameRole).toString());
140 listWidget->addItem(item);
141 zoneCombo->removeItem(zoneCombo->currentIndex());
142 }
143 slotUpdateButton();
144}
145
146void TimeScaleConfigDialog::remove()
147{
148 zoneCombo->insertItem(0, listWidget->currentItem()->text(), zoneCombo->itemData(zoneCombo->currentIndex(), TimeZoneNameRole).toString());
149 delete listWidget->takeItem(listWidget->currentRow());
150 slotUpdateButton();
151}
152
153void TimeScaleConfigDialog::up()
154{
155 int row = listWidget->currentRow();
156 QListWidgetItem *item = listWidget->takeItem(row);
157 listWidget->insertItem(qMax(row - 1, 0), item);
158 listWidget->setCurrentRow(qMax(row - 1, 0));
159}
160
161void TimeScaleConfigDialog::down()
162{
163 int row = listWidget->currentRow();
164 QListWidgetItem *item = listWidget->takeItem(row);
165 listWidget->insertItem(qMin(row + 1, listWidget->count()), item);
166 listWidget->setCurrentRow(qMin(row + 1, listWidget->count() - 1));
167}
168
169QStringList TimeScaleConfigDialog::zones() const
170{
172 const int count = listWidget->count();
173 list.reserve(count);
174 for (int i = 0; i < count; ++i) {
175 list << listWidget->item(i)->data(TimeZoneNameRole).toString();
176 }
177 return list;
178}
179
180#include "moc_timescaleconfigdialog.cpp"
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
Namespace EventViews provides facilities for displaying incidences, including events,...
Definition agenda.h:33
KCALUTILS_EXPORT QString tzUTCOffsetStr(const QTimeZone &tz)
KIOCORE_EXPORT QStringList list(const QString &fileClass)
const QList< QKeySequence > & preferences()
void clicked(bool checked)
void setShortcut(const QKeySequence &key)
const char * constData() const const
virtual void accept()
QIcon fromTheme(const QString &name)
void append(QList< T > &&value)
iterator begin()
qsizetype count() const const
pointer data()
iterator end()
void reserve(qsizetype size)
void currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
void setDefault(bool)
QString fromUtf8(QByteArrayView str)
UserRole
Key_Return
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QList< QByteArray > availableTimeZoneIds()
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:12:29 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.