1 /* ============================================================
2 *
3 * This file is a part of KDE project
4 *
5 *
6 * Date : 2015-07-28
7 * Description : Common widgets shared by plugins
8 *
9 * Copyright (C) 2013 by Pankaj Kumar <me at panks dot me>
10 * Copyright (C) 2015 by Shourya Singh Gupta <shouryasgupta at gmail dot com>
11 *
12 * This program is free software; you can redistribute it
13 * and/or modify it under the terms of the GNU General
14 * Public License as published by the Free Software Foundation;
15 * either version 2, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * ============================================================ */
23
24 #include "kpsettingswidget.h"
25
26 // Qt includes
27
28 #include <QLabel>
29 #include <QSpinBox>
30 #include <QCheckBox>
31 #include <QGroupBox>
32 #include <QRadioButton>
33 #include <QButtonGroup>
34 #include <QGridLayout>
35 #include <QHBoxLayout>
36 #include <QVBoxLayout>
37 #include <QPushButton>
38 #include <QApplication>
39 #include <QComboBox>
40 #include <QScrollArea>
41
42 // KDE includes
43
44 #include <klocalizedstring.h>
45
46 // LibKIPI includes
47
48 #include <KIPI/Interface>
49 #include <KIPI/UploadWidget>
50 #include <KIPI/ImageCollection>
51
52 namespace KIPIPlugins
53 {
54
55 class KPSettingsWidget::Private
56 {
57 public:
58
Private(QWidget * const widget,KIPI::Interface * const iface,const QString & pluginName)59 Private(QWidget* const widget, KIPI::Interface* const iface, const QString& pluginName)
60 {
61 m_pluginName = pluginName;
62 mainLayout = new QHBoxLayout(widget);
63 m_imgList = new KPImagesList(widget);
64 settingsScrollArea = new QScrollArea(widget);
65 m_settingsBox = new QWidget(settingsScrollArea);
66 m_settingsBoxLayout = new QVBoxLayout(m_settingsBox);
67 m_headerLbl = new QLabel(widget);
68 m_accountBox = new QGroupBox(i18n("Account"),m_settingsBox);
69 m_accountBoxLayout = new QGridLayout(m_accountBox);
70 m_userNameDisplayLbl = new QLabel(m_accountBox);
71 m_changeUserBtn = new QPushButton(m_accountBox);
72 m_albBox = new QGroupBox(i18n("Album"),m_settingsBox);
73 m_albumsBoxLayout = new QGridLayout(m_albBox);
74 m_albumsCoB = new QComboBox(m_albBox);
75 m_newAlbumBtn = new QPushButton(m_accountBox);
76 m_reloadAlbumsBtn = new QPushButton(m_accountBox);
77 m_sizeBox = new QGroupBox(i18n("Max Dimension"), m_settingsBox);
78 m_sizeBoxLayout = new QVBoxLayout(m_sizeBox);
79 m_dlDimensionCoB = new QComboBox(m_sizeBox);
80 m_uploadBox = new QGroupBox(i18n("Destination"), m_settingsBox);
81 m_uploadWidget = iface->uploadWidget(m_uploadBox);
82 m_uploadBoxLayout = new QVBoxLayout(m_uploadBox);
83 m_optionsBox = new QGroupBox(i18n("Options"),m_settingsBox);
84 m_optionsBoxLayout = new QGridLayout(m_optionsBox);
85 m_originalChB = new QCheckBox(m_optionsBox);
86 m_resizeChB = new QCheckBox(m_optionsBox);
87 m_dimensionSpB = new QSpinBox(m_optionsBox);
88 m_imageQualitySpB = new QSpinBox(m_optionsBox);
89 m_progressBar = new KPProgressWidget(m_settingsBox);
90
91 }
92
93 KPImagesList* m_imgList;
94 KIPI::UploadWidget* m_uploadWidget;
95 QString m_pluginName;
96
97 QLabel* m_headerLbl;
98 QLabel* m_userNameDisplayLbl;
99 QPushButton* m_changeUserBtn;
100 QComboBox* m_dlDimensionCoB;
101 QScrollArea* settingsScrollArea;
102
103 QComboBox* m_albumsCoB;
104 QPushButton* m_newAlbumBtn;
105 QPushButton* m_reloadAlbumsBtn;
106
107 QCheckBox* m_originalChB;
108 QCheckBox* m_resizeChB;
109 QSpinBox* m_dimensionSpB;
110 QSpinBox* m_imageQualitySpB;
111
112 QHBoxLayout* mainLayout;
113
114 QWidget* m_settingsBox;
115 QVBoxLayout* m_settingsBoxLayout;
116
117 QGroupBox* m_albBox;
118 QGridLayout* m_albumsBoxLayout;
119
120 QGroupBox* m_optionsBox;
121 QGridLayout* m_optionsBoxLayout;
122
123 QGroupBox* m_uploadBox;
124 QVBoxLayout* m_uploadBoxLayout;
125
126 QGroupBox* m_sizeBox;
127 QVBoxLayout* m_sizeBoxLayout;
128
129 QGroupBox* m_accountBox;
130 QGridLayout* m_accountBoxLayout;
131
132 KPProgressWidget* m_progressBar;
133 };
134
KPSettingsWidget(QWidget * const parent,KIPI::Interface * const iface,const QString & pluginName)135 KPSettingsWidget::KPSettingsWidget(QWidget* const parent, KIPI::Interface* const iface, const QString& pluginName)
136 : QWidget(parent),
137 d(new Private(this,iface,pluginName))
138 {
139 d->m_pluginName = pluginName;
140 setObjectName(d->m_pluginName + QString::fromLatin1(" Widget"));
141
142 //----------------------------------------------------------
143
144 const int spacing = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing);
145
146 d->m_imgList->setControlButtonsPlacement(KPImagesList::ControlButtonsBelow);
147 d->m_imgList->setAllowRAW(true);
148 d->m_imgList->listView()->setWhatsThis(i18n("This is the list of images to upload to your %1 account.", d->m_pluginName));
149
150 d->settingsScrollArea->setMinimumSize(400,500);
151 d->settingsScrollArea->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
152 d->settingsScrollArea->setWidget(d->m_settingsBox);
153 d->settingsScrollArea->setWidgetResizable(true);
154 d->settingsScrollArea->setFrameShadow(QFrame::Plain);
155
156 d->m_headerLbl->setWhatsThis(i18n("This is a clickable link to open %1 in a browser.", d->m_pluginName));
157 d->m_headerLbl->setOpenExternalLinks(true);
158 d->m_headerLbl->setFocusPolicy(Qt::NoFocus);
159
160 //------------------------------------------------------------
161
162 d->m_accountBox->setWhatsThis(i18n("This is the %1 account that is currently logged in.", d->m_pluginName));
163
164 QLabel* const userNameLbl = new QLabel(i18nc("account settings","Name:"), d->m_accountBox);
165 d->m_changeUserBtn->setText(i18n("Change Account"));
166 d->m_changeUserBtn->setIcon(QIcon::fromTheme(QString::fromLatin1("system-switch-user")).pixmap(16));
167 d->m_changeUserBtn->setToolTip(i18n("Change %1 account for transfer", d->m_pluginName));
168
169 d->m_accountBoxLayout->addWidget(userNameLbl, 0, 0, 1, 2);
170 d->m_accountBoxLayout->addWidget(d->m_userNameDisplayLbl, 0, 2, 1, 2);
171 d->m_accountBoxLayout->addWidget(d->m_changeUserBtn, 1, 0, 1, 4);
172 d->m_accountBoxLayout->setContentsMargins(spacing, spacing, spacing, spacing);
173 d->m_accountBoxLayout->setSpacing(spacing);
174
175 //-------------------------------------------------------------
176
177 d->m_albBox->setWhatsThis(i18n("This is the %1 folder to/from which selected photos will be uploaded/downloaded.", d->m_pluginName));
178
179 QLabel* const albLbl = new QLabel(i18n("Album:"), d->m_albBox);
180
181 d->m_albumsCoB->setEditable(false);
182
183 d->m_newAlbumBtn->setText(i18n("New Album"));
184 d->m_newAlbumBtn->setIcon(QIcon::fromTheme(QString::fromLatin1("list-add")).pixmap(16));
185 d->m_newAlbumBtn->setToolTip(i18n("Create new %1 folder", d->m_pluginName));
186
187 d->m_reloadAlbumsBtn->setText(i18nc("album list","Reload"));
188 d->m_reloadAlbumsBtn->setIcon(QIcon::fromTheme(QString::fromLatin1("view-refresh")).pixmap(16));
189 d->m_reloadAlbumsBtn->setToolTip(i18n("Reload album list"));
190
191 d->m_albumsBoxLayout->addWidget(albLbl, 0, 0, 1, 1);
192 d->m_albumsBoxLayout->addWidget(d->m_albumsCoB, 0, 1, 1, 4);
193 d->m_albumsBoxLayout->addWidget(d->m_newAlbumBtn, 1, 3, 1, 1);
194 d->m_albumsBoxLayout->addWidget(d->m_reloadAlbumsBtn, 1, 4, 1, 1);
195
196 //----------------------------------------------------------
197
198 d->m_sizeBox->setWhatsThis(i18n("This is the maximum dimension of the images. Images larger than this will be scaled down."));
199 d->m_dlDimensionCoB->addItem(i18n("Original Size"), QString::fromLatin1("d"));
200 d->m_dlDimensionCoB->addItem(i18n("1600 px"), QString::fromLatin1("1600"));
201 d->m_dlDimensionCoB->addItem(i18n("1440 px"), QString::fromLatin1("1440"));
202 d->m_dlDimensionCoB->addItem(i18n("1280 px"), QString::fromLatin1("1280"));
203 d->m_dlDimensionCoB->addItem(i18n("1152 px"), QString::fromLatin1("1152"));
204 d->m_dlDimensionCoB->addItem(i18n("1024 px"), QString::fromLatin1("1024"));
205 d->m_dlDimensionCoB->setCurrentIndex(0);
206 d->m_sizeBoxLayout->addWidget(d->m_dlDimensionCoB);
207
208 // ------------------------------------------------------------------------
209
210 d->m_uploadBox->setWhatsThis(i18n("This is the location where %1 images will be downloaded.", d->m_pluginName));
211 d->m_uploadBoxLayout->addWidget(d->m_uploadWidget);
212
213 //-----------------------------------------------------------
214
215 d->m_optionsBox->setWhatsThis(i18n("These are the options that would be applied to photos before upload."));
216
217 d->m_originalChB->setText(i18n("Upload original image file"));
218 d->m_originalChB->setChecked(false);
219 d->m_originalChB->hide();
220
221 d->m_resizeChB->setText(i18n("Resize photos before uploading"));
222 d->m_resizeChB->setChecked(false);
223
224 d->m_dimensionSpB->setMinimum(0);
225 d->m_dimensionSpB->setMaximum(5000);
226 d->m_dimensionSpB->setSingleStep(10);
227 d->m_dimensionSpB->setValue(1600);
228 d->m_dimensionSpB->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
229 d->m_dimensionSpB->setEnabled(false);
230
231 QLabel* const dimensionLbl = new QLabel(i18n("Maximum Dimension:"), d->m_optionsBox);
232
233 d->m_imageQualitySpB->setMinimum(0);
234 d->m_imageQualitySpB->setMaximum(100);
235 d->m_imageQualitySpB->setSingleStep(1);
236 d->m_imageQualitySpB->setValue(90);
237 d->m_imageQualitySpB->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
238
239 QLabel* const imageQualityLbl = new QLabel(i18n("JPEG Quality:"), d->m_optionsBox);
240
241 d->m_optionsBoxLayout->addWidget(d->m_originalChB, 0, 0, 1, 5);
242 d->m_optionsBoxLayout->addWidget(d->m_resizeChB, 1, 0, 1, 5);
243 d->m_optionsBoxLayout->addWidget(imageQualityLbl, 2, 1, 1, 1);
244 d->m_optionsBoxLayout->addWidget(d->m_imageQualitySpB, 2, 2, 1, 1);
245 d->m_optionsBoxLayout->addWidget(dimensionLbl, 3, 1, 1, 1);
246 d->m_optionsBoxLayout->addWidget(d->m_dimensionSpB, 3, 2, 1, 1);
247 d->m_optionsBoxLayout->setRowStretch(4, 10);
248 d->m_optionsBoxLayout->setSpacing(spacing);
249 d->m_optionsBoxLayout->setContentsMargins(spacing, spacing, spacing, spacing);
250
251 d->m_progressBar->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
252 d->m_progressBar->hide();
253
254 //------------------------------------------------------
255
256 d->m_settingsBoxLayout->addWidget(d->m_headerLbl);
257 d->m_settingsBoxLayout->addWidget(d->m_accountBox);
258 d->m_settingsBoxLayout->addWidget(d->m_albBox);
259 d->m_settingsBoxLayout->addWidget(d->m_sizeBox);
260 d->m_settingsBoxLayout->addWidget(d->m_uploadBox);
261 d->m_settingsBoxLayout->addWidget(d->m_optionsBox);
262 d->m_settingsBoxLayout->addWidget(d->m_progressBar);
263 d->m_settingsBoxLayout->setSpacing(spacing);
264 d->m_settingsBoxLayout->setContentsMargins(spacing, spacing, spacing, spacing);
265
266 //--------------------------------------------------------
267
268 d->mainLayout->addWidget(d->m_imgList);
269 d->mainLayout->addWidget(d->settingsScrollArea);
270 d->mainLayout->setContentsMargins(QMargins());
271 d->mainLayout->setSpacing(spacing);
272
273 //-------------------------------------------------------
274
275 connect(d->m_originalChB, SIGNAL(toggled(bool)),
276 this, SLOT(slotResizeChecked()));
277
278 connect(d->m_resizeChB, SIGNAL(toggled(bool)),
279 this, SLOT(slotResizeChecked()));
280 }
281
~KPSettingsWidget()282 KPSettingsWidget::~KPSettingsWidget()
283 {
284 delete d;
285 }
286
getDestinationPath() const287 QString KPSettingsWidget::getDestinationPath() const
288 {
289 return d->m_uploadWidget->selectedImageCollection().uploadUrl().toLocalFile();
290 }
291
imagesList() const292 KPImagesList* KPSettingsWidget::imagesList() const
293 {
294 return d->m_imgList;
295 }
296
slotResizeChecked()297 void KPSettingsWidget::slotResizeChecked()
298 {
299 d->m_resizeChB->setEnabled(!d->m_originalChB->isChecked());
300 d->m_imageQualitySpB->setEnabled(!d->m_originalChB->isChecked());
301 d->m_dimensionSpB->setEnabled(d->m_resizeChB->isChecked() && !d->m_originalChB->isChecked());
302 }
303
progressBar() const304 KPProgressWidget* KPSettingsWidget::progressBar() const
305 {
306 return d->m_progressBar;
307 }
308
addWidgetToSettingsBox(QWidget * const widget)309 void KPSettingsWidget::addWidgetToSettingsBox(QWidget* const widget)
310 {
311 d->m_settingsBoxLayout->addWidget(widget);
312 d->m_settingsBoxLayout->removeWidget(d->m_progressBar); // NOTE: This is important because progress bar always has to be at the end of settings box layout. So we remove it and then add it back.
313 d->m_settingsBoxLayout->addWidget(d->m_progressBar);
314 }
315
replaceImageList(QWidget * const imgList)316 void KPSettingsWidget::replaceImageList(QWidget* const imgList)
317 {
318 d->m_imgList->hide();
319 d->mainLayout->removeWidget(d->m_imgList);
320 d->mainLayout->insertWidget(0, imgList);
321 }
322
getSettingsBox() const323 QWidget* KPSettingsWidget::getSettingsBox() const
324 {
325 return d->m_settingsBox;
326 }
327
getSettingsBoxLayout() const328 QVBoxLayout* KPSettingsWidget::getSettingsBoxLayout() const
329 {
330 return d->m_settingsBoxLayout;
331 }
332
getAlbumBox() const333 QGroupBox* KPSettingsWidget::getAlbumBox() const
334 {
335 return d->m_albBox;
336 }
337
getAlbumBoxLayout() const338 QGridLayout* KPSettingsWidget::getAlbumBoxLayout() const
339 {
340 return d->m_albumsBoxLayout;
341 }
342
getOptionsBox() const343 QGroupBox* KPSettingsWidget::getOptionsBox() const
344 {
345 return d->m_optionsBox;
346 }
347
getOptionsBoxLayout() const348 QGridLayout* KPSettingsWidget::getOptionsBoxLayout() const
349 {
350 return d->m_optionsBoxLayout;
351 }
352
getUploadBox() const353 QGroupBox* KPSettingsWidget::getUploadBox() const
354 {
355 return d->m_uploadBox;
356 }
357
getUploadBoxLayout() const358 QVBoxLayout* KPSettingsWidget::getUploadBoxLayout() const
359 {
360 return d->m_uploadBoxLayout;
361 }
362
getSizeBox() const363 QGroupBox* KPSettingsWidget::getSizeBox() const
364 {
365 return d->m_sizeBox;
366 }
367
getSizeBoxLayout() const368 QVBoxLayout* KPSettingsWidget::getSizeBoxLayout() const
369 {
370 return d->m_sizeBoxLayout;
371 }
372
getAccountBox() const373 QGroupBox* KPSettingsWidget::getAccountBox() const
374 {
375 return d->m_accountBox;
376 }
377
getAccountBoxLayout() const378 QGridLayout* KPSettingsWidget::getAccountBoxLayout() const
379 {
380 return d->m_accountBoxLayout;
381 }
382
getHeaderLbl() const383 QLabel* KPSettingsWidget::getHeaderLbl() const
384 {
385 return d->m_headerLbl;
386 }
387
getUserNameLabel() const388 QLabel* KPSettingsWidget::getUserNameLabel() const
389 {
390 return d->m_userNameDisplayLbl;
391 }
392
getChangeUserBtn() const393 QPushButton* KPSettingsWidget::getChangeUserBtn() const
394 {
395 return d->m_changeUserBtn;
396 }
397
getDimensionCoB() const398 QComboBox* KPSettingsWidget::getDimensionCoB() const
399 {
400 return d->m_dlDimensionCoB;
401 }
402
getNewAlbmBtn() const403 QPushButton* KPSettingsWidget::getNewAlbmBtn() const
404 {
405 return d->m_newAlbumBtn;
406 }
407
getReloadBtn() const408 QPushButton* KPSettingsWidget::getReloadBtn() const
409 {
410 return d->m_reloadAlbumsBtn;
411 }
412
getOriginalCheckBox() const413 QCheckBox* KPSettingsWidget::getOriginalCheckBox() const
414 {
415 return d->m_originalChB;
416 }
417
getResizeCheckBox() const418 QCheckBox* KPSettingsWidget::getResizeCheckBox() const
419 {
420 return d->m_resizeChB;
421 }
422
getDimensionSpB() const423 QSpinBox* KPSettingsWidget::getDimensionSpB() const
424 {
425 return d->m_dimensionSpB;
426 }
427
getImgQualitySpB() const428 QSpinBox* KPSettingsWidget::getImgQualitySpB() const
429 {
430 return d->m_imageQualitySpB;
431 }
432
getAlbumsCoB() const433 QComboBox* KPSettingsWidget::getAlbumsCoB() const
434 {
435 return d->m_albumsCoB;
436 }
437
438 } // namespace KIPIPlugins
439