//---->filename qimages.cpp

#include "getfile.h"

#include "qimages.h"

#include <QtGui> 

void MyWindow::paint(const std::string &str,

                     const QPixmap image,

                     const int num)

{

    static char ch[100];

    sprintf(ch, "The %d'th file", num);

    label.move(0,160);

    label.setText(ch);

 

    update();

    QPainter painter(this);

    painter.setPen(Qt::blue);

 

    painter.drawText(100,20,QString(str.c_str()));

    painter.drawPixmap(100,40,image);

}

 

void MyWindow::auto_display()

{

    image.load(name_itr->c_str());

    if(image.isNull()){

        files.erase(name_itr);

    }      

    if(++name_itr == files.end()){

        name_itr = files.begin();

        picture_num = 0;

    }

    paint(*name_itr, image,picture_num++);

}

 

void MyWindow::timer_control()

{

    static bool auto_display_button_pushed = false;

    if(auto_display_button_pushed == true){

        auto_display_button_pushed = false;

    }else{

        auto_display_button_pushed = true;

    }

    if(auto_display_button_pushed){

        timer.start(1000);

    }else{

        timer.stop();

    }

}

 

void MyWindow::paintEvent(QPaintEvent *)

{

    image.load(name_itr->c_str());

    if(image.isNull()){

        std::cout<<"this is not a picture"<<std::endl;

        files.erase(name_itr);

    }else{

    }  

    if(picture_num == 0) picture_num++;

    paint(*name_itr, image, picture_num);

}

 

void MyWindow::mousePressEvent(QMouseEvent * e ){

    if(e->x() > 100 && e->y() > 30){

        QPainter painter(this);

        image.load(name_itr->c_str());

        if(image.isNull()){

            std::cout<<"this is not a picture"<<std::endl;
        }

        if(++name_itr == files.end()){

            name_itr = files.begin();

            picture_num = 0;

        }

        paint(*name_itr, image, picture_num++);

    }


void MyWindow::dirChanged(QString out)

{

    if("" != out){

        QDir dirPath(out);

        QStringList filters;

        filters.clear();

        filters<<"*.png"<<"*.bmp"<<"*jpg";

        dirPath.setNameFilters(filters);

        QStringList imageList = dirPath.entryList();

        files.erase(files.begin(), files.end());

        for(QStringList::const_iterator itmp = imageList.begin();

            itmp != imageList.end(); ++itmp){

            files.push_back(itmp->toStdString());

        }

        for(std::vector<std::string>::iterator itr = files.begin();

            itr != files.end(); ++itr){

            std::cout<<*itr<<"   ";

        }

        myShow();

    }

}

 

void MyWindow::myShow()

{

    name_itr = files.begin();

    image.load(name_itr->c_str());

    if(image.isNull()){

        std::cout<<"this is not a picture"<<std::endl;

        files.erase(name_itr);

    }else{
    }  

    paint(*name_itr, image, picture_num);

}

 

//---->filename qimages.h

#ifndef QIMAGES_H

#define QIMAGES_H

 

#include <cstdlib>

#include <vector>

#include <iterator>

#include <QtGui>

 

class MyWindow : public QWidget

{

Q_OBJECT

public:

    MyWindow(const std::vector<std::string> & );

    ~MyWindow();

    void paintEvent(QPaintEvent *);

    void mousePressEvent(QMouseEvent *);

    void myShow();

    void paint(const std::string &str,

               const QPixmap image,

               const int num);

private:

    std::vector<std::string> files;

    typedef std::vector<std::string>::iterator VSI;

    VSI name_itr;

    QPixmap image;

 

    QPushButton full_screen_button;

    QPushButton normal_screen_button;

    QPushButton auto_display_button;

    QPushButton open_button;

 

    QFileDialog dialog;

    QTimer timer;

    QLabel label;

    int picture_num;

private slots:

    void dirChanged(QString);

    void timer_control();

    void auto_display();

    virtual void repaint(){

        update();

        this->paintEvent(0);

    }

};

 

inline MyWindow::MyWindow(const std::vector<std::string> &names)

                :QWidget(0),files(names),

                name_itr(files.begin()),

                full_screen_button("full screen", this),

                normal_screen_button("normal screen", this),

                auto_display_button("auto play",this),

                open_button("Open",this),

                dialog(this),

                timer(this),

                label(this),

                picture_num( 0)

{

    image.load((*name_itr).c_str() );

 

    full_screen_button.setGeometry(0,0,100,30);

    full_screen_button.setFont(QFont("Times", 12, QFont::Bold));

    connect(&full_screen_button, SIGNAL(clicked()),

            this, SLOT(showFullScreen()) );

 

    normal_screen_button.setGeometry(0,40,100,30);

    normal_screen_button.setFont(QFont("Times", 12, QFont::Bold));

    connect(&normal_screen_button, SIGNAL(clicked()),

            this, SLOT(showNormal()) );

 

    auto_display_button.setGeometry(0,80,100,30);

    auto_display_button.setFont(QFont("Times", 12, QFont::Bold));

    connect(&auto_display_button, SIGNAL(clicked()),

            this, SLOT(timer_control()) );

 

    open_button.setGeometry(0,120,100,30);

    open_button.setFont(QFont("Times", 12, QFont::Bold));

    connect(&open_button, SIGNAL(clicked()),

            &dialog, SLOT(show()) );

 

    connect(&timer, SIGNAL(timeout()),

            this, SLOT(auto_display()) );

 

    dialog.setFileMode(QFileDialog::Directory);

    connect(&dialog, SIGNAL(currentChanged(QString)),

            this, SLOT(dirChanged(QString)) );

 

    label.setGeometry(0,160,100,30);

}

   

inline MyWindow::~MyWindow(){

    files.~vector();

    name_itr.~VSI();

    image.~QPixmap();

}

#endif //QIMAGES_H

 

 

//---->filename getfile.h

#ifndef GETFILE_H

#define GETFILE_H

 

#include <iostream>

#include <fstream>

#include <cstdlib>

#include <vector>

#include <string>

#include <algorithm>

 

std::vector<std::string> getfile();

 

#endif //GETFILE_H

 

 

 

//---->filename getfile.cpp

#include "getfile.h"

#include <QtGui>

 

std::vector<std::string> getfile()

{

    std::vector<std::string> vs;

 

    QDir dirPath(QDir::currentPath());

    QStringList filters;

    filters<<"*.png"<<"*.mmp"<<"*.jpg";

    dirPath.setNameFilters(filters);

    QStringList file_name_list = dirPath.entryList();

    for(QStringList::const_iterator it = file_name_list.begin();

        it != file_name_list.end(); ++it){

        vs.push_back(it->toStdString());

    }

    return vs;

}

 

 

//---->filename drive.cpp

#include "qimages.h"

#include "getfile.h"

#include <algorithm>

#include <qtextcodec.h>

 

template<class Type>

class print{

public:

    void operator()(Type & str){

        std::cout<<str<<std::endl;

    }

};

 

int main(int argc, char *argv[])

{

    // QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

    QApplication a(argc, argv);

 

    std::vector<std::string> names = getfile();

    if (-1 == system("rm -rf LIST")) {exit(1);}

 

    std::for_each(names.begin(), names.end(),print<std::string>());

 

    MyWindow w(names);

    w.setGeometry(0,0,800,600);

    w.show();

    return a.exec();

}