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