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