Projet

Général

Profil

Paste
Statistiques
| Branche: | Révision:

ryxeo-webphotoalbum-git / original.cpp @ 71c02254

Historique | Voir | Annoter | Télécharger (11,3 ko)

1
/**
2
  * Classe
3
  * @see https://redmine.ryxeo.com/projects/
4
  * @author 2012 Eric Seigne <eric.seigne@ryxeo.com>
5
  * @see The GNU Public License (GNU/GPL) v3
6
  *
7
  *
8
  *
9
  * This program is free software; you can redistribute it and/or modify
10
  * it under the terms of the GNU General Public License as published by
11
  * the Free Software Foundation; either version 3 of the License, or
12
  * (at your option) any later version.
13
  *
14
  * This program is distributed in the hope that it will be useful, but
15
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16
  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17
  * for more details.
18
  *
19
  * You should have received a copy of the GNU General Public License along
20
  * with this program. If not, see <http://www.gnu.org/licenses/>.
21
  */
22

    
23

    
24
#include "original.h"
25
#include "ui_original.h"
26

    
27

    
28
//---------------------------------------------------------------------------------
29
bool viewsSortProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
30
{
31
    if(this->filterRegExp().isEmpty()) return true;
32

    
33
    QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
34
    myModel* fileModel = qobject_cast<myModel*>(sourceModel());
35

    
36
    if(fileModel->fileInfo(index0).isHidden()) return false;
37
    else return true;
38
}
39

    
40

    
41
//---------------------------------------------------------------------------------
42
bool viewsSortProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
43
{
44
    myModel* fsModel = dynamic_cast<myModel*>(sourceModel());
45

    
46
    if(left.column() == 1)          //size
47
    {
48
        if(fsModel->size(left) > fsModel->size(right)) return true;
49
        else return false;
50
    }
51
    else
52
    if(left.column() == 3)          //date
53
    {
54
        if(fsModel->fileInfo(left).lastModified() > fsModel->fileInfo(right).lastModified()) return true;
55
        else return false;
56
    }
57

    
58
    return QSortFilterProxyModel::lessThan(left,right);
59
}
60

    
61
//---------------------------------------------------------------------------------
62
QStringList myCompleter::splitPath(const QString& path) const
63
{
64
    QStringList parts = path.split("/");
65
    parts[0] = "/";
66

    
67
    return parts;
68
}
69

    
70
//---------------------------------------------------------------------------------
71
QString myCompleter::pathFromIndex(const QModelIndex& index) const
72
{
73
    if(!index.isValid()) return "";
74

    
75
    QModelIndex idx = index;
76
    QStringList list;
77
    do
78
    {
79
        QString t = model()->data(idx, Qt::EditRole).toString();
80
        list.prepend(t);
81
        QModelIndex parent = idx.parent();
82
        idx = parent.sibling(parent.row(), index.column());
83
    }
84
    while (idx.isValid());
85

    
86
    list[0].clear() ; // the join below will provide the separator
87

    
88
    return list.join("/");
89
}
90

    
91
//---------------------------------------------------------------------------
92
QString formatSize(qint64 num)
93
{
94
    QString total;
95
    const qint64 kb = 1024;
96
    const qint64 mb = 1024 * kb;
97
    const qint64 gb = 1024 * mb;
98
    const qint64 tb = 1024 * gb;
99

    
100
    if (num >= tb) total = QString("%1TB").arg(QString::number(qreal(num) / tb, 'f', 2));
101
    else if(num >= gb) total = QString("%1GB").arg(QString::number(qreal(num) / gb, 'f', 2));
102
    else if(num >= mb) total = QString("%1MB").arg(QString::number(qreal(num) / mb, 'f', 1));
103
    else if(num >= kb) total = QString("%1KB").arg(QString::number(qreal(num) / kb,'f', 1));
104
    else total = QString("%1 bytes").arg(num);
105

    
106
    return total;
107
}
108

    
109
// =========================================================================================================================
110

    
111

    
112
original::original(QWidget *parent) :
113
    QMainWindow(parent),
114
    ui(new Ui::original)
115
{
116
    ui->setupUi(this);
117
}
118

    
119
original::~original()
120
{
121
    delete ui;
122
}
123

    
124
void original::on_btnExport_clicked()
125
{
126
    //Creation de la destination
127
    QDir rep;
128
    QString dest = ui->leDest->text().trimmed() + "/web-gallery";
129
    rep.mkpath(dest);
130
    rep.mkpath(dest + "/hq");
131
    rep.mkpath(dest + "/lq");
132
    rep.mkpath(dest + "/mq");
133
    rep.mkpath(dest + "/thumbs");
134
    rep.mkpath(dest + "/zip");
135
    rep.mkpath(dest + "/comments");
136

    
137
    //Creation des images
138
    QDir dir(ui->leSource->text().trimmed());
139
    dir.setFilter(QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot);
140
    QFileInfoList list = dir.entryInfoList();
141
    for(int i = 0; i < list.count(); i++) {
142
        ui->statusBar->clearMessage();
143
        ui->statusBar->showMessage(trUtf8("Fichier en cours: %1").arg(list.at(i).fileName()),3000);
144
        qApp->processEvents();
145

    
146
        qDebug() << "Processing : " << list.at(i).absoluteFilePath();
147
        QPixmap pixmap(list.at(i).absoluteFilePath());
148
        pixmap.save(QString("%1/hq/img-%2.jpg").arg(dest).arg(i));
149

    
150
        ui->statusBar->showMessage(trUtf8("Fichier en cours: %1 [hq]").arg(list.at(i).fileName()),3000);
151
        QPixmap pixmapThumbs(pixmap.scaled(QSize(120,120), Qt::KeepAspectRatio, Qt::SmoothTransformation));
152
        pixmapThumbs.save(QString("%1/thumbs/img-%2.jpg").arg(dest).arg(i));
153

    
154
        ui->statusBar->showMessage(trUtf8("Fichier en cours: %1 [hq] [mq]").arg(list.at(i).fileName()),3000);
155
        QPixmap pixmapMQ(pixmap.scaled(QSize(800,600), Qt::KeepAspectRatio, Qt::SmoothTransformation));
156
        pixmapMQ.save(QString("%1/mq/img-%2.jpg").arg(dest).arg(i));
157

    
158
        ui->statusBar->showMessage(trUtf8("Fichier en cours: %1 [hq] [mq] [lq]").arg(list.at(i).fileName()),3000);
159
        QPixmap pixmapLQ(pixmap.scaled(QSize(640,480), Qt::KeepAspectRatio, Qt::SmoothTransformation));
160
        pixmapLQ.save(QString("%1/lq/img-%2.jpg").arg(dest).arg(i));
161

    
162

    
163
        QFile file(QString("%1/comments/%2.txt").arg(dest).arg(i));
164
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
165
            return;
166

    
167
        QTextStream out(&file);
168
        out << "<span>Photo " + QString::number(i) + "</span>\n";
169
        file.close();
170
        ui->statusBar->showMessage(trUtf8("Fichier en cours: %1 [hq] [mq] [lq] [meta]").arg(list.at(i).fileName()),3000);
171

    
172
        //================== on copie les metadata
173
        Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(list.at(i).absoluteFilePath().toStdString());
174
        Exiv2::Image::AutoPtr imageLQ = Exiv2::ImageFactory::open(QString("%1/lq/img-%2.jpg").arg(dest).arg(i).toStdString());
175
        Exiv2::Image::AutoPtr imageMQ = Exiv2::ImageFactory::open(QString("%1/mq/img-%2.jpg").arg(dest).arg(i).toStdString());
176
        Exiv2::Image::AutoPtr imageHQ = Exiv2::ImageFactory::open(QString("%1/hq/img-%2.jpg").arg(dest).arg(i).toStdString());
177
        Exiv2::Image::AutoPtr imageThumb = Exiv2::ImageFactory::open(QString("%1/thumbs/img-%2.jpg").arg(dest).arg(i).toStdString());
178
        if (image.get() != 0)
179
        {
180
            image->readMetadata();
181
            Exiv2::ExifData &exifData = image->exifData();
182
            if (!exifData.empty())
183
            {
184
                bool setArtist = false;
185
                bool setCopyright = false;
186
                bool setSoftware = false;
187
                Exiv2::ExifData::const_iterator end = exifData.end();
188
                qDebug() << "============================ DEBUT ===============================";
189
                for (Exiv2::ExifData::const_iterator i = exifData.begin(); i != end; ++i)
190
                {
191
                    qDebug() << i->key().c_str() << " = " << i->value().toString().c_str();
192
                    if (i->key() == "Exif.Image.Artist") {
193
                        exifData["Exif.Image.Artist"]    = "Toto le hero";
194
                        setArtist = true;
195
                    }
196
                    if (i->key() == "Exif.Image.Copyright") {
197
                        exifData["Exif.Image.Copyright"]    = "Toto le hero";
198
                        setCopyright = true;
199
                    }
200
                    if (i->key() == "Exif.Image.Software") {
201
                        exifData["Exif.Image.Software"]  = "RyXeo WebPhotoAlbum - http://www.ryxeo.com/";
202
                        setSoftware = true;
203
                    }
204
                }
205
                //Si on n'a pas les meta il faut les ajouter
206

    
207
                //Mise à jour de l'auteur
208
                if(!setArtist) {
209
                    Exiv2::ExifKey k("Exif.Image.Artist");
210
                    Exiv2::Value::AutoPtr v = Exiv2::Value::create(Exiv2::asciiString);
211
                    v->read("Toto le hero");
212
                    exifData.add(k,v.get());
213
                }
214

    
215
                if(!setCopyright) {
216
                    Exiv2::ExifKey k2("Exif.Image.Copyright");
217
                    Exiv2::Value::AutoPtr v2 = Exiv2::Value::create(Exiv2::asciiString);
218
                    v2->read("Toto le hero");
219
                    exifData.add(k2,v2.get());
220
                }
221

    
222
                if(!setSoftware) {
223
                    Exiv2::ExifKey k3("Exif.Image.Software");
224
                    Exiv2::Value::AutoPtr v3 = Exiv2::Value::create(Exiv2::asciiString);
225
                    v3->read("RyXéo WebPhotoAlbum - http://www.ryxeo.com/");
226
                    exifData.add(k3,v3.get());
227
                }
228

    
229
                qDebug() << "============================ APRES ===============================";
230
                Exiv2::ExifData::const_iterator end2 = exifData.end();
231
                for (Exiv2::ExifData::const_iterator i2 = exifData.begin(); i2 != end2; ++i2)
232
                {
233
                    qDebug() << i2->key().c_str() << " = " << i2->value().toString().c_str();
234
                }
235
                qDebug() << "============================ FIN ===============================";
236

    
237
                imageLQ->setExifData(exifData);
238
                imageLQ->writeMetadata();
239

    
240
                imageMQ->setExifData(exifData);
241
                imageMQ->writeMetadata();
242

    
243
                imageHQ->setExifData(exifData);
244
                imageHQ->writeMetadata();
245

    
246
                imageThumb->setExifData(exifData);
247
                imageThumb->writeMetadata();
248
            }
249
        }
250
        ui->statusBar->showMessage(trUtf8("Fichier en cours: %1 [hq] [mq] [lq] [meta] ... terminé").arg(list.at(i).fileName()),3000);
251
    }
252
}
253

    
254
void original::on_action_Nouvel_album_triggered()
255
{
256
    QTreeWidgetItem *i = new QTreeWidgetItem(ui->treeWidget);
257
    i->setText(0, trUtf8("Nouvel album"));
258
}
259

    
260
//---------------------------------------------------------------------------
261
void original::thumbUpdate(QModelIndex index)
262
{
263
    qDebug() << "original::thumbUpdate";
264
    ui->lvResult->update(m_modelView->mapFromSource(index));
265
}
266

    
267
void original::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
268
{
269
    QStringList items;
270
    m_modelList = new myModel();
271
    m_modelList->setRootPath("/tmp/");
272

    
273
    m_modelList->populateItem("/tmp/t/20120529-lea_plongee_cala_montjoi-000.jpg");
274
    m_modelList->populateItem("/tmp/t/20120529-lea_plongee_cala_montjoi-001.jpg");
275
    m_modelList->populateItem("/tmp/t/20120529-lea_plongee_cala_montjoi-002.jpg");
276
    m_modelList->populateItem("/tmp/t/20120529-lea_plongee_cala_montjoi-003.jpg");
277
    items.append("/tmp/t/20120529-lea_plongee_cala_montjoi-000.jpg");
278
    items.append("/tmp/t/20120529-lea_plongee_cala_montjoi-001.jpg");
279
    items.append("/tmp/t/20120529-lea_plongee_cala_montjoi-002.jpg");
280
    items.append("/tmp/t/20120529-lea_plongee_cala_montjoi-003.jpg");
281
    QtConcurrent::run(m_modelList,&myModel::loadThumbsQSL,items);
282

    
283
    m_modelView = new viewsSortProxyModel();
284
    m_modelView->setSourceModel(m_modelList);
285
    m_modelView->setSortCaseSensitivity(Qt::CaseInsensitive);
286
    ui->lvResult->setModel(m_modelView);
287

    
288
    connect(m_modelList,SIGNAL(thumbUpdate(QModelIndex)),this,SLOT(thumbUpdate(QModelIndex)));
289

    
290
}
Redmine Appliance - Powered by TurnKey Linux