1 
2 
3 #include "versioncontrolwidget.h"
4 
5 #include <QLabel>
6 #include <QVBoxLayout>
7 #include <QSpinBox>
8 #include <QTimeEdit>
9 #include <QTextEdit>
10 #include <QDateTimeEdit>
11 #include <QRadioButton>
12 
13 //=============================================================================
14 // DateChooserWidget
15 //-----------------------------------------------------------------------------
16 
DateChooserWidget(QWidget * parent)17 DateChooserWidget::DateChooserWidget(QWidget *parent)
18     : QWidget(parent), m_selectedRadioIndex(0) {
19   QVBoxLayout *mainLayout = new QVBoxLayout;
20   mainLayout->setMargin(0);
21   mainLayout->setAlignment(Qt::AlignTop);
22 
23   // Time
24   QHBoxLayout *timeLayout = new QHBoxLayout;
25 
26   m_timeRadioButton = new QRadioButton;
27   m_timeRadioButton->setChecked(true);
28   connect(m_timeRadioButton, SIGNAL(clicked()), this,
29           SLOT(onRadioButtonClicked()));
30 
31   m_timeEdit = new QTimeEdit;
32   m_timeEdit->setDisplayFormat("hh:mm");
33 
34   timeLayout->addWidget(m_timeRadioButton);
35   timeLayout->addWidget(m_timeEdit);
36   timeLayout->addWidget(new QLabel(tr("time ago.")));
37   timeLayout->addStretch();
38   mainLayout->addLayout(timeLayout);
39 
40   // Days
41   QHBoxLayout *dayLayout = new QHBoxLayout;
42 
43   m_dayRadioButton = new QRadioButton;
44   connect(m_dayRadioButton, SIGNAL(clicked()), this,
45           SLOT(onRadioButtonClicked()));
46 
47   m_dayEdit = new QSpinBox;
48   m_dayEdit->setRange(1, 99);
49   m_dayEdit->setValue(1);
50   m_dayEdit->setEnabled(false);
51 
52   dayLayout->addWidget(m_dayRadioButton);
53   dayLayout->addWidget(m_dayEdit);
54   dayLayout->addWidget(new QLabel(tr("days ago.")));
55   dayLayout->addStretch();
56   mainLayout->addLayout(dayLayout);
57 
58   // Weeks
59   QHBoxLayout *weekLayout = new QHBoxLayout;
60 
61   m_weekRadioButton = new QRadioButton;
62   connect(m_weekRadioButton, SIGNAL(clicked()), this,
63           SLOT(onRadioButtonClicked()));
64 
65   m_weekEdit = new QSpinBox;
66   m_weekEdit->setRange(1, 99);
67   m_weekEdit->setValue(1);
68   m_weekEdit->setEnabled(false);
69 
70   weekLayout->addWidget(m_weekRadioButton);
71   weekLayout->addWidget(m_weekEdit);
72   weekLayout->addWidget(new QLabel(tr("weeks ago.")));
73   weekLayout->addStretch();
74   mainLayout->addLayout(weekLayout);
75 
76   // Custom date
77   QHBoxLayout *customDateLayout = new QHBoxLayout;
78 
79   m_dateRadioButton = new QRadioButton;
80   connect(m_dateRadioButton, SIGNAL(clicked()), this,
81           SLOT(onRadioButtonClicked()));
82 
83   m_dateTimeEdit = new QDateTimeEdit;
84   m_dateTimeEdit->setDisplayFormat("yyyy-MM-dd hh:mm");
85   QDate now = QDate::currentDate();
86   m_dateTimeEdit->setMaximumDate(now);
87   m_dateTimeEdit->setDate(now);
88   m_dateTimeEdit->setEnabled(false);
89   m_dateTimeEdit->setCalendarPopup(true);
90 
91   customDateLayout->addWidget(m_dateRadioButton);
92   customDateLayout->addWidget(m_dateTimeEdit);
93   customDateLayout->addWidget(new QLabel(tr("( Custom date )")));
94   customDateLayout->addStretch();
95   mainLayout->addLayout(customDateLayout);
96 
97   setLayout(mainLayout);
98 }
99 
100 //-----------------------------------------------------------------------------
101 
disableAllWidgets()102 void DateChooserWidget::disableAllWidgets() {
103   m_timeEdit->setEnabled(false);
104   m_dayEdit->setEnabled(false);
105   m_weekEdit->setEnabled(false);
106   m_dateTimeEdit->setEnabled(false);
107 }
108 
109 //-----------------------------------------------------------------------------
110 
onRadioButtonClicked()111 void DateChooserWidget::onRadioButtonClicked() {
112   QObject *obj         = sender();
113   QRadioButton *button = dynamic_cast<QRadioButton *>(obj);
114 
115   if (!button) return;
116 
117   disableAllWidgets();
118 
119   if (button == m_timeRadioButton) {
120     m_timeEdit->setEnabled(true);
121     m_selectedRadioIndex = 0;
122   } else if (button == m_dayRadioButton) {
123     m_dayEdit->setEnabled(true);
124     m_selectedRadioIndex = 1;
125   } else if (button == m_weekRadioButton) {
126     m_weekEdit->setEnabled(true);
127     m_selectedRadioIndex = 2;
128   } else if (button == m_dateRadioButton) {
129     m_dateTimeEdit->setEnabled(true);
130     m_selectedRadioIndex = 3;
131   }
132 }
133 
134 //-----------------------------------------------------------------------------
135 
getRevisionString() const136 QString DateChooserWidget::getRevisionString() const {
137   QString timeString;
138   QString dateString;
139 
140   QDate today = QDate::currentDate();
141 
142   if (m_selectedRadioIndex == 0)  // Time
143   {
144     QTime currentTime = QTime::currentTime();
145     QTime t           = m_timeEdit->time();
146     int seconds       = t.hour() * 60 * 60 + t.minute() * 60;
147     currentTime       = currentTime.addSecs(-seconds);
148     timeString        = currentTime.toString("hh:mm");
149     dateString        = today.toString("yyyy-MM-dd");
150   } else if (m_selectedRadioIndex == 1)  // Days
151   {
152     timeString = "00:00";
153     today      = today.addDays(-(m_dayEdit->value()));
154     dateString = today.toString("yyyy-MM-dd");
155   } else if (m_selectedRadioIndex == 2)  // Weeks
156   {
157     timeString = "00:00";
158     today      = today.addDays(-(m_weekEdit->value() * 7));
159     dateString = today.toString("yyyy-MM-dd");
160   } else  // Custom date
161   {
162     QTime time = m_dateTimeEdit->time();
163     timeString = time.toString("hh:mm");
164 
165     QDate date = m_dateTimeEdit->date();
166     dateString = date.toString("yyyy-MM-dd");
167   }
168 
169   return "{" + dateString + " " + timeString + "}";
170 }
171 
172 //-----------------------------------------------------------------------------
173 
174 //=============================================================================
175 // ConflictWidget
176 //-----------------------------------------------------------------------------
177 
ConflictWidget(QWidget * parent)178 ConflictWidget::ConflictWidget(QWidget *parent)
179     : QWidget(parent), m_button1Text(tr("Mine")), m_button2Text(tr("Theirs")) {
180   m_mainLayout = new QVBoxLayout;
181   m_mainLayout->setMargin(0);
182   m_mainLayout->setAlignment(Qt::AlignTop);
183   setLayout(m_mainLayout);
184 }
185 
186 //-----------------------------------------------------------------------------
187 
setFiles(const QStringList & files)188 void ConflictWidget::setFiles(const QStringList &files) {
189   DoubleRadioWidget *radio = 0;
190   int fileCount            = files.size();
191   for (int i = 0; i < fileCount; i++) {
192     radio = new DoubleRadioWidget(m_button1Text, m_button2Text, files.at(i));
193     connect(radio, SIGNAL(valueChanged()), this, SLOT(onRadioValueChanged()));
194     m_mainLayout->addWidget(radio);
195     m_radios.insert(radio, -1);
196   }
197   m_mainLayout->addStretch();
198 }
199 
200 //-----------------------------------------------------------------------------
201 
onRadioValueChanged()202 void ConflictWidget::onRadioValueChanged() {
203   DoubleRadioWidget *obj = dynamic_cast<DoubleRadioWidget *>(sender());
204   if (obj) m_radios[obj] = obj->getValue();
205 
206   if (!m_radios.values().contains(-1)) emit allConflictSetted();
207 }
208 
209 //-----------------------------------------------------------------------------
210 
getFilesWithOption(int option) const211 QStringList ConflictWidget::getFilesWithOption(int option) const {
212   QStringList files;
213   QMap<DoubleRadioWidget *, int>::const_iterator i;
214   for (i = m_radios.constBegin(); i != m_radios.constEnd(); ++i) {
215     if (i.value() == option) files << i.key()->getText();
216   }
217   return files;
218 }
219 
220 //=============================================================================
221 // DoubleRadioWidget
222 //-----------------------------------------------------------------------------
223 
DoubleRadioWidget(const QString & button1Text,const QString & button2Text,const QString & text,QWidget * parent)224 DoubleRadioWidget::DoubleRadioWidget(const QString &button1Text,
225                                      const QString &button2Text,
226                                      const QString &text, QWidget *parent)
227     : QWidget(parent)
228 
229 {
230   QHBoxLayout *mainLayout = new QHBoxLayout;
231   mainLayout->setMargin(0);
232 
233   m_firstButton = new QRadioButton(button1Text);
234   connect(m_firstButton, SIGNAL(clicked()), this, SIGNAL(valueChanged()));
235   m_secondButton = new QRadioButton(button2Text);
236   connect(m_secondButton, SIGNAL(clicked()), this, SIGNAL(valueChanged()));
237 
238   m_label = new QLabel;
239   m_label->setFixedWidth(180);
240   m_label->setText(text);
241 
242   mainLayout->addWidget(m_label);
243   mainLayout->addSpacing(20);
244   mainLayout->addWidget(m_firstButton);
245   mainLayout->addWidget(m_secondButton);
246 
247   setLayout(mainLayout);
248 }
249 
250 //-----------------------------------------------------------------------------
251 
getValue() const252 int DoubleRadioWidget::getValue() const {
253   if (m_firstButton->isChecked())
254     return 0;
255   else if (m_secondButton->isChecked())
256     return 1;
257   else
258     return -1;
259 }
260 
261 //-----------------------------------------------------------------------------
262 
getText() const263 QString DoubleRadioWidget::getText() const { return m_label->text(); }
264