1 //===========================================
2 //  Lumina-Desktop source code
3 //  Copyright (c) 2018, Loïc Bartoletti
4 //  Available under the 3-clause BSD license
5 //  See the LICENSE file for full details
6 //===========================================
7 #include "mainUI.h"
8 #include "ui_mainUI.h"
9 #include <QDebug>
10 
11 #include <LUtils.h>
12 #include <LuminaXDG.h>
13 #include <QDesktopServices>
14 #include <QFileDialog>
15 #include <QImageWriter>
16 #include <QInputDialog>
17 #include <QMessageBox>
18 #include <QUrl>
19 
20 #include <QtPrintSupport>
21 
MainUI()22 MainUI::MainUI () : QMainWindow (), ui (new Ui::MainUI ())
23 {
24     settings = LUtils::openSettings ("lumina-desktop", "lumina-photo", this);
25     ppath = settings->value ("previous-path", QDir::homePath ()).toString ();
26     pfilter = settings->value ("previous-filter", "image/jpeg").toString ();
27 
28     ui->setupUi (this);
29     // Any special UI changes
30 
31     graphicsScene = new QGraphicsScene ();
32     ui->photoView->setScene (graphicsScene);
33 
34     setupConnections ();
35     setupIcons ();
36     setupFilters ();
37 }
38 
~MainUI()39 MainUI::~MainUI ()
40 {
41 }
42 
loadArguments(QStringList args)43 void MainUI::loadArguments (QStringList args)
44 {
45     files.clear ();
46     // Parse out the arguments
47     for (int i = 0; i < args.length (); i++)
48     {
49         if (!QImageReader::imageFormat (args[i]).isEmpty ())
50         {
51             files.append (args[i]);
52         }
53     }
54     if (files.count () > 0)
55     {
56         idx = 0;
57         loadFile (files.at (0));
58     }
59 }
60 
setupConnections()61 void MainUI::setupConnections ()
62 {
63     connect (ui->actionZoom_In, SIGNAL (triggered ()), this, SLOT (zoomInToggled ()));
64     connect (ui->actionZoom_Out, SIGNAL (triggered ()), this, SLOT (zoomOutToggled ()));
65     connect (ui->action_Fit_to_windows, SIGNAL (triggered ()), this, SLOT (fitZoomToggled ()));
66     connect (ui->action_Normal_Zoom, SIGNAL (triggered ()), this, SLOT (normalZoomToggled ()));
67     connect (ui->action_Exit, SIGNAL (triggered ()), this, SLOT (closeApplication ()));
68     connect (ui->action_Open, SIGNAL (triggered ()), this, SLOT (open ()));
69     connect (ui->action_Save_as, SIGNAL (triggered ()), this, SLOT (save ()));
70     connect (ui->action_Print, SIGNAL (triggered ()), this, SLOT (print ()));
71     connect (ui->actionNext, SIGNAL (triggered ()), this, SLOT (nextToggled ()));
72     connect (ui->actionBack, SIGNAL (triggered ()), this, SLOT (backToggled ()));
73     connect (ui->actionFirst, SIGNAL (triggered ()), this, SLOT (firstToggled ()));
74     connect (ui->actionLast, SIGNAL (triggered ()), this, SLOT (lastToggled ()));
75     connect (ui->photoView, SIGNAL (nextImage ()), this, SLOT (nextToggled ()));
76     connect (ui->photoView, SIGNAL (prevImage ()), this, SLOT (backToggled ()));
77 }
78 
setupIcons()79 void MainUI::setupIcons ()
80 {
81     ui->action_Exit->setIcon (LXDG::findIcon ("application-close", "dialog-close"));
82     ui->action_Fit_to_windows->setIcon (LXDG::findIcon ("zoom-fit-best", ""));
83     ui->action_Normal_Zoom->setIcon (LXDG::findIcon ("zoom-original", ""));
84     ui->actionZoom_In->setIcon (LXDG::findIcon ("zoom-in", ""));
85     ui->actionZoom_Out->setIcon (LXDG::findIcon ("zoom-out", ""));
86     ui->actionFirst->setIcon (LXDG::findIcon ("arrow-left-double", ""));
87     ui->actionBack->setIcon (LXDG::findIcon ("arrow-left", ""));
88     ui->actionLast->setIcon (LXDG::findIcon ("arrow-right-double", ""));
89     ui->actionNext->setIcon (LXDG::findIcon ("arrow-right", ""));
90 }
91 
setupFilters()92 void MainUI::setupFilters ()
93 {
94     foreach (const QByteArray &mimeTypeName, QImageReader::supportedMimeTypes ())
95         mimeTypeFiltersReader.append (mimeTypeName);
96 
97     mimeTypeFiltersReader.sort ();
98 
99     foreach (const QByteArray &mimeTypeName, QImageWriter::supportedMimeTypes ())
100         mimeTypeFiltersWriter.append (mimeTypeName);
101 
102     mimeTypeFiltersWriter.sort ();
103 }
104 
105 
106 // ==== PRIVATE SLOTS ====
fitZoomToggled()107 void MainUI::fitZoomToggled ()
108 {
109     ui->photoView->zoomFit ();
110 }
111 
normalZoomToggled()112 void MainUI::normalZoomToggled ()
113 {
114     ui->photoView->zoomNormal ();
115 }
116 
zoomOutToggled()117 void MainUI::zoomOutToggled ()
118 {
119     ui->photoView->zoomOut ();
120 }
121 
zoomInToggled()122 void MainUI::zoomInToggled ()
123 {
124     ui->photoView->zoomIn ();
125 }
126 
firstToggled()127 void MainUI::firstToggled ()
128 {
129     if (idx != 0)
130     {
131         idx = 0;
132         loadFile (files.at (idx));
133     }
134 }
135 
lastToggled()136 void MainUI::lastToggled ()
137 {
138     if (idx != files.count () - 1)
139     {
140         idx = files.count () - 1;
141         loadFile (files.at (idx));
142     }
143 }
144 
backToggled()145 void MainUI::backToggled ()
146 {
147     if (idx > 0)
148     {
149         idx -= 1;
150         loadFile (files.at (idx));
151     }
152 }
153 
nextToggled()154 void MainUI::nextToggled ()
155 {
156     if (idx < files.count () - 1)
157     {
158         idx += 1;
159         loadFile (files.at (idx));
160     }
161 }
162 
closeApplication()163 void MainUI::closeApplication ()
164 {
165     this->close ();
166 }
167 
loadFile(const QString file)168 bool MainUI::loadFile (const QString file)
169 {
170     // Load the file as-is
171     QImageReader reader (file);
172     reader.setAutoTransform (true);
173     actualImage = reader.read ();
174     if (actualImage.isNull ())
175     {
176         QMessageBox::information (
177         this, QGuiApplication::applicationDisplayName (),
178         tr ("Cannot load %1: %2").arg (QDir::toNativeSeparators (file), reader.errorString ()));
179         return false;
180     }
181     graphicsScene->clear ();
182     graphicsScene->setSceneRect (actualImage.rect ());
183     graphicsScene->addPixmap (QPixmap::fromImage (actualImage));
184 
185     ui->photoView->zoomFit ();
186     return true;
187 }
188 
open()189 void MainUI::open ()
190 {
191     QFileDialog dialog (this, tr ("Open File"), ppath);
192     dialog.setFileMode (QFileDialog::ExistingFiles);
193     dialog.setAcceptMode (QFileDialog::AcceptOpen);
194     dialog.setMimeTypeFilters (mimeTypeFiltersReader);
195     dialog.selectMimeTypeFilter (pfilter);
196     if (dialog.exec ())
197     {
198         files.clear ();
199         files = dialog.selectedFiles ();
200         idx = 0;
201 
202         ppath = files.at (idx).section ("/", 0, -2); // just the directory
203         settings->setValue ("previous-path", ppath);
204         pfilter = dialog.selectedMimeTypeFilter ();
205         settings->setValue ("previous-filter", pfilter);
206         loadFile (files.at (idx));
207     }
208 }
209 
save()210 bool MainUI::save ()
211 {
212     QFileDialog dialog (this, tr ("Save as"), ppath);
213     dialog.setFileMode (QFileDialog::AnyFile);
214     dialog.setAcceptMode (QFileDialog::AcceptSave);
215     dialog.setMimeTypeFilters (mimeTypeFiltersWriter);
216     if (dialog.exec ())
217     {
218         QString filename = dialog.selectedFiles ().first ();
219         QImageWriter writer (filename);
220 
221         if (!writer.write (actualImage))
222         {
223             QMessageBox::information (this, QGuiApplication::applicationDisplayName (),
224                                       tr ("Cannot write %1: %2").arg (QDir::toNativeSeparators (filename)),
225                                       writer.errorString ());
226             return false;
227         }
228     }
229 
230     return true;
231 }
232 
print()233 void MainUI::print ()
234 {
235     QPrinter printer;
236     QPrintDialog dialog (&printer, this);
237     if (dialog.exec ())
238     {
239         QPainter painter (&printer);
240         QRect rect = painter.viewport ();
241         QSize size = actualImage.size ();
242         size.scale (rect.size (), Qt::KeepAspectRatio);
243         painter.setViewport (rect.x (), rect.y (), size.width (), size.height ());
244         painter.setWindow (actualImage.rect ());
245         painter.drawPixmap (0, 0, QPixmap::fromImage (actualImage));
246     }
247 }
248