/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, you may use this file under the terms of the BSD license ** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of The Qt Company Ltd nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qfmwindow.h" #include #include #include #include #include #include #include #include #include #include #define FILEMANAGER "File Manager" QfmWindow::QfmWindow(QWidget *parent) : QMainWindow(parent) { m_curDir= "top"; m_multichecking = false; m_topDirList<<"Root"<<"Home"<<"Oem"<<"User Data"<<"SD Card"<<"USB Disk"; m_topPathList<<"/"<availableGeometry(this); resize(availableGeometry.width(), availableGeometry.height()); m_btnreturn = new QPushButton(this); m_btnreturn->setStyleSheet(tr("border-image: url(:/image/return.png);")); QPixmap pixmap(":/image/return.png"); m_btnreturn->setFixedSize(pixmap.width(), pixmap.height()); m_titleLabel = new QLabel(tr(FILEMANAGER), this); QFont font = m_titleLabel->font(); font.setBold(true); m_titleLabel->setFont(font); m_titleLabel->setAlignment(Qt::AlignCenter); m_titleLabel->setStyleSheet("background-color:rgba(255, 255, 255, 0)"); m_btnopen = new QPushButton(this); m_btnopen->setText(tr("open")); m_btnopen->setVisible(true); m_listWid = new QListWidget(this); m_listWid->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_listWid->setStyleSheet("background-color:rgb(204,228,247)"); getlist(m_listWid, nullptr); m_listWid->setObjectName(tr("filelist")); m_toolbar = new QToolBar(this); m_toolbar->addWidget(m_btnreturn); m_toolbar->addWidget(m_btnopen); m_toolbar->addWidget(m_titleLabel); setCentralWidget(m_listWid); addToolBar(m_toolbar); setStyleSheet("background-color:rgb(204,228,247)"); setWindowState(Qt::WindowMaximized); setWindowFlags(Qt::FramelessWindowHint); } QFileInfoList QfmWindow::getFiles(const QString &path) { QDir *dir = new QDir(path); QFileInfoList files; switch (m_Filter) { case FileAll: files = dir->entryInfoList(QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot); break; case FileVideo: files = dir->entryInfoList(m_videoSuffixList, QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot); break; case FileMusic: files = dir->entryInfoList(m_musicSuffixList, QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot); break; case FilePic: files = dir->entryInfoList(m_picSuffixList, QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot); break; } for(int i=0;isetText(m_curDir); }else { m_titleLabel->setText(tr(FILEMANAGER)); } } void QfmWindow::updatecurdir(QString path, bool back) { if(istop(m_curDir)){ for(int i = 0; i < m_topDirList.count(); i++){ if(!m_topDirList.at(i).compare(path)){ m_curDir = m_topPathList.at(i); } } }else if(inTopList(m_curDir)){ if(back){ m_curDir = "top"; return; } if(m_curDir.compare("/")){ m_curDir = m_curDir + '/' + path; }else { m_curDir = '/' + path; } }else { if(back){ int index = m_curDir.lastIndexOf('/'); if(index == 0){ m_curDir = "/"; }else { m_curDir = m_curDir.mid(0, index); } }else { if(m_curDir.compare("/")){ m_curDir = m_curDir + '/' + path; }else { m_curDir = '/' + path; } } } } QListWidgetItem* QfmWindow::getitem(QString name) { QListWidgetItem *item = new QListWidgetItem(); item->setText(name); item->setTextAlignment(Qt::AlignJustify); item->setTextColor(QColor(Qt::black)); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); return item; } void QfmWindow::getlist(QListWidget *listWid, QListWidgetItem *item) { QFileInfoList files; bool intop = istop(m_curDir); int row = listWid->row(item); QString path;// = item->text(); if(item){ path = item->text(); } listWid->clear(); if(intop){ if(item){ path = m_topPathList.at(row); files = getFiles(path); if(files.empty()){ return; } for(int i = 0; i < files.count(); ++i){ listWid->addItem(getitem(files[i].fileName())); } }else{ for(int i = 0; i < m_topDirList.size(); ++i){ listWid->addItem(getitem(m_topDirList.at(i))); } } }else { if(inTopList(m_curDir)){ if(m_curDir.compare("/")){ files = getFiles(m_curDir + '/' + path); }else{ files = getFiles('/' + path); } if(files.empty()){ return; } for(int i = 0; i < files.count(); ++i){ listWid->addItem(getitem(files[i].fileName())); } }else { if(m_curDir.compare("/")){ files = getFiles(m_curDir + '/' + path); }else{ files = getFiles('/' + path); } if(files.empty()){ return; } for(int i = 0; i < files.count(); ++i){ listWid->addItem(getitem(files[i].fileName())); } } } } bool QfmWindow::istop(QString path) { if(! path.compare("top")){ return true; } return false; } bool QfmWindow::inTopList(QString path) { for(int i = 0; i < m_topPathList.count(); i++){ if(!m_topPathList.at(i).compare(path)){ return true; } } return false; } int QfmWindow::getCheckedItemCnt(void) { int cnt = 0; for(int i=0; i < m_listWid->count(); i++){ QListWidgetItem * ii = m_listWid->item(i); if(ii->checkState() == Qt::Checked){ cnt++; } } return cnt; } void QfmWindow::on_openClicked() { QStringList files; bool gogogo = false; if(! istop(m_curDir)){ for(int i=0; i < m_listWid->count(); i++){ QListWidgetItem * item = m_listWid->item(i); if(item->checkState() == Qt::Checked){ QString path = m_curDir + "/" + item->text(); QFileInfo file(path); if(file.exists()){ gogogo = true; files.append(file.absoluteFilePath()); } } } } if(gogogo){ m_mimeUtils.openFiles(files); } } void QfmWindow::on_returnClicked() { if(istop(m_curDir)){ qApp->exit(0); }else{ updatecurdir(nullptr, true); getlist(m_listWid, nullptr); updatelabel(); } } void QfmWindow::on_itemClicked(QListWidgetItem *item) { if(item->checkState() == Qt::Checked){ m_btnopen->show(); } int checkedcnt = getCheckedItemCnt(); if(checkedcnt >= 1){ return; } if(! istop(m_curDir)){ QString path = m_curDir + "/" + item->text(); QDir dir(path); if(! dir.exists()){ m_mimeUtils.openInApp(path, ""); return; } } QString path = item->text(); getlist(m_listWid, item); updatecurdir(path, false); updatelabel(); }