Akonadi Contacts

dateeditwidget.cpp
1 /*
2  This file is part of Contact Editor.
3 
4  SPDX-FileCopyrightText: 2009 Tobias Koenig <[email protected]>
5 
6  SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8 
9 #include "dateeditwidget.h"
10 
11 #include <KDatePicker>
12 #include <KDatePickerPopup>
13 
14 #include <KLocalizedString>
15 #include <QContextMenuEvent>
16 #include <QHBoxLayout>
17 #include <QLocale>
18 #include <QToolButton>
19 
20 DateView::DateView(QWidget *parent)
21  : QLineEdit(parent)
22 {
23  setPlaceholderText(i18n("Click to add date"));
24  setReadOnly(true);
25 }
26 
27 void DateView::contextMenuEvent(QContextMenuEvent *event)
28 {
29  if (text().isEmpty()) {
30  return;
31  }
32 
33  QMenu menu;
34  menu.addAction(i18n("Remove"), this, &DateView::emitSignal);
35 
36  menu.exec(event->globalPos());
37 }
38 
39 void DateView::emitSignal()
40 {
41  Q_EMIT resetDate();
42 }
43 
44 DateEditWidget::DateEditWidget(Type type, QWidget *parent)
45  : QWidget(parent)
46  , mReadOnly(false)
47 {
48  auto layout = new QHBoxLayout(this);
50 
51  mView = new DateView;
52  layout->addWidget(mView);
53 
54  mClearButton = new QToolButton;
56  mClearButton->setIcon(QIcon::fromTheme(QStringLiteral("edit-clear-locationbar-rtl")));
57  } else {
58  mClearButton->setIcon(QIcon::fromTheme(QStringLiteral("edit-clear-locationbar-ltr")));
59  }
60  layout->addWidget(mClearButton);
61 
62  mSelectButton = new QToolButton;
64  switch (type) {
65  case General:
66  mSelectButton->setIcon(QIcon::fromTheme(QStringLiteral("view-calendar-day")));
67  break;
68  case Birthday:
69  mSelectButton->setIcon(QIcon::fromTheme(QStringLiteral("view-calendar-birthday")));
70  break;
71  case Anniversary:
72  mSelectButton->setIcon(QIcon::fromTheme(QStringLiteral("view-calendar-wedding-anniversary")));
73  break;
74  }
75 
76  layout->addWidget(mSelectButton);
77  setFocusProxy(mSelectButton);
79 
81  mSelectButton->setMenu(mMenu);
82 
83  connect(mClearButton, &QToolButton::clicked, this, &DateEditWidget::resetDate);
84  connect(mMenu, &KDatePickerPopup::dateChanged, this, &DateEditWidget::dateSelected);
85  connect(mView, &DateView::resetDate, this, &DateEditWidget::resetDate);
86 
87  updateView();
88 }
89 
90 DateEditWidget::~DateEditWidget() = default;
91 
92 void DateEditWidget::setDate(const QDate &date)
93 {
94  mDate = date;
95  mMenu->setDate(mDate);
96  updateView();
97 }
98 
99 QDate DateEditWidget::date() const
100 {
101  return mDate;
102 }
103 
104 void DateEditWidget::setReadOnly(bool readOnly)
105 {
106  mReadOnly = readOnly;
107 
108  mSelectButton->setEnabled(!readOnly);
109  mClearButton->setEnabled(!readOnly);
110 }
111 
112 void DateEditWidget::dateSelected(const QDate &date)
113 {
114  mDate = date;
115  updateView();
116 }
117 
118 void DateEditWidget::resetDate()
119 {
120  mDate = QDate();
121  updateView();
122 }
123 
124 void DateEditWidget::updateView()
125 {
126  if (mDate.isValid()) {
127  mView->setText(QLocale().toString(mDate));
128  mClearButton->show();
129  } else {
130  mView->setText(QString());
131  mClearButton->hide();
132  }
133 }
void setFocusPolicy(Qt::FocusPolicy policy)
QLayout * layout() const const
void clicked(bool checked)
QIcon fromTheme(const QString &name)
void setFocusProxy(QWidget *w)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void dateChanged(const QDate &date)
QAction * addAction(const QString &text)
QString i18n(const char *text, const TYPE &arg...)
char * toString(const T &value)
AKONADI_CALENDAR_EXPORT KCalendarCore::Event::Ptr event(const Akonadi::Item &item)
void setIcon(const QIcon &icon)
void addWidget(QWidget *w)
LeftToRight
void setContentsMargins(int left, int top, int right, int bottom)
bool setDate(int year, int month, int day)
StrongFocus
void setPopupMode(QToolButton::ToolButtonPopupMode mode)
QAction * exec()
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sat Apr 1 2023 04:09:04 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.