2 #include "folderpanel.h"
\r
3 #include "mainwindow.h"
\r
4 #include "ui_folderpanel.h"
\r
6 #include <QMessageBox>
\r
10 #include <QDesktopServices>
\r
11 #include <QSettings>
\r
13 #include <windows.h>
\r
16 QString FilesizeToString(quint64 size)
\r
18 if (size >= 1024 * 1024 * 1024) {
\r
19 return QString("%1GB").arg(int(10 * size / (1024 * 1024 * 1024)) / 10.0);
\r
21 if (size >= 1024 * 1024) {
\r
22 return QString("%1MB").arg(int(10 * size / (1024 * 1024)) / 10.0);
\r
25 return QString("%1KB").arg(int(10 * size / 1024) / 10.0);
\r
27 return QString("%1B").arg(size);
\r
30 FolderPanel::FolderPanel(QWidget *parent) :
\r
32 ui(new Ui::FolderPanel),
\r
35 m_fsWatcher(new QFileSystemWatcher(this)),
\r
41 connect(ui->fileTable, SIGNAL(cellChanged(int,int)),
\r
42 this, SLOT(onUpdateMark(int,int)));
\r
45 QHeaderView *header = ui->fileTable->horizontalHeader();
\r
46 header->setSectionResizeMode(0, QHeaderView::ResizeToContents);
\r
47 header->setSectionResizeMode(1, QHeaderView::Stretch);
\r
48 header->setSectionResizeMode(2, QHeaderView::ResizeToContents);
\r
49 header->setSectionResizeMode(3, QHeaderView::ResizeToContents);
\r
53 m_dir.setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);
\r
54 if (settings.value(IniKey_ShowHidden, false).toBool()) {
\r
55 m_dir.setFilter(m_dir.filter() | QDir::Hidden);
\r
57 if (settings.value(IniKey_ShowSystem, false).toBool()) {
\r
58 m_dir.setFilter(m_dir.filter() | QDir::System);
\r
62 m_dir.setSorting(QDir::DirsFirst | QDir::IgnoreCase);
\r
65 FolderPanel::~FolderPanel()
\r
71 FileTableWidget* FolderPanel::fileTable()
\r
73 return ui->fileTable;
\r
76 const FileTableWidget *FolderPanel::fileTable() const
\r
78 return ui->fileTable;
\r
81 void FolderPanel::setCurrentFolder(const QString &path)
\r
85 getMainWnd()->setStatusText(tr("ファイルリストを更新中..."));
\r
86 QString curDir = m_dir.absolutePath();
\r
87 m_dir.setPath(QDir::cleanPath(path));
\r
88 m_dir.canonicalPath();
\r
90 QFileInfoList list = m_dir.entryInfoList();
\r
93 QMessageBox::critical(
\r
96 tr("フォルダが存在しないか利用できません。"));
\r
97 m_dir.setPath(curDir);
\r
98 ui->locationField->setText(curDir);
\r
99 getMainWnd()->setStatusText(tr("レディ"));
\r
106 // QtはWindowsのシステムファイル属性をうまく判定できていないため、
\r
107 // GetFileAttributes APIを使ってフィルタする
\r
109 showSystem = settings.value(IniKey_ShowSystem, false).toBool();
\r
112 ui->fileTable->model()->removeRows(0, ui->fileTable->rowCount());
\r
113 for (int i = 0; i < list.size(); i++) {
\r
114 QFileInfo info = list.at(i);
\r
115 if (info.fileName() == ".." && m_dir.isRoot()) {
\r
120 DWORD dwFlags = ::GetFileAttributes(info.absoluteFilePath().toStdWString().c_str());
\r
121 if (!showSystem && dwFlags != DWORD(-1) && (dwFlags & FILE_ATTRIBUTE_SYSTEM)) {
\r
126 int row = ui->fileTable->rowCount();
\r
127 ui->fileTable->insertRow(row);
\r
130 QTableWidgetItem *iName = new QTableWidgetItem(info.fileName());
\r
131 iName->setFlags(iName->flags() ^ Qt::ItemIsEditable);
\r
132 if (info.fileName() == "..") {
\r
133 iName->setIcon(QIcon(":/images/Up.png"));
\r
136 iName->setIcon(m_IconFactory.icon(info));
\r
138 ui->fileTable->setItem(row, 1, iName);
\r
142 if (info.isDir()) {
\r
146 str = FilesizeToString(info.size());
\r
148 QTableWidgetItem *iSize = new QTableWidgetItem(str);
\r
149 iSize->setFlags(iSize->flags() ^ Qt::ItemIsEditable);
\r
150 iSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
\r
151 ui->fileTable->setItem(row, 2, iSize);
\r
154 QTableWidgetItem *iDateTime = new QTableWidgetItem(
\r
155 info.lastModified().toString("yy/MM/dd hh:mm"));
\r
156 iDateTime->setFlags(iDateTime->flags() ^ Qt::ItemIsEditable);
\r
157 ui->fileTable->setItem(row, 3, iDateTime);
\r
159 // シグナル処理の関係で、チェックボックスは最後に追加する
\r
160 QTableWidgetItem *iCheck = new QTableWidgetItem(tr(""));
\r
161 iCheck->setFlags(iCheck->flags() ^ Qt::ItemIsEditable);
\r
162 if (info.fileName() != "..") {
\r
163 iCheck->setFlags(iCheck->flags() | Qt::ItemIsUserCheckable);
\r
164 iCheck->setCheckState(Qt::Unchecked);
\r
166 ui->fileTable->setItem(row, 0, iCheck);
\r
169 ui->fileTable->selectRow(0);
\r
170 ui->fileTable->resizeRowsToContents();
\r
172 ui->locationField->setText(m_dir.absolutePath());
\r
173 getMainWnd()->setStatusText(tr("レディ"));
\r
177 void FolderPanel::InstallWatcher()
\r
179 UninstallWatcher();
\r
181 m_fsWatcher = new QFileSystemWatcher(this);
\r
182 m_fsWatcher->addPath(m_dir.absolutePath());
\r
183 connect(m_fsWatcher, SIGNAL(directoryChanged(QString)),
\r
184 this, SLOT(on_directoryChanged(QString)));
\r
187 void FolderPanel::UninstallWatcher()
\r
189 if (m_fsWatcher != NULL) {
\r
190 delete m_fsWatcher;
\r
192 m_fsWatcher = NULL;
\r
195 void FolderPanel::onUpdateMark(int, int column)
\r
197 if (column != 0 || isUpdating()) {
\r
201 // マークフォルダ数、ファイル数、サイズを計算する
\r
202 int numFolders = 0;
\r
204 quint64 sizeTotal = 0;
\r
205 for (int n = 0; n < ui->fileTable->rowCount(); n++) {
\r
206 if (ui->fileTable->item(n, 0)->checkState() != Qt::Checked) {
\r
209 QString name = ui->fileTable->item(n, 1)->text();
\r
210 QFileInfo info(m_dir.absoluteFilePath(name));
\r
211 if (info.isDir()) {
\r
216 sizeTotal += info.size();
\r
221 if (numFolders > 0) {
\r
222 msg += tr("%1個のフォルダ ").arg(numFolders);
\r
224 if (numFiles > 0) {
\r
225 msg += tr("%1個のファイル ").arg(numFiles);
\r
227 if (msg.length() > 0) {
\r
229 msg += FilesizeToString(sizeTotal);
\r
232 ui->label->setText(msg);
\r
235 void FolderPanel::on_locationField_editingFinished()
\r
237 ui->locationField->blockSignals(true);
\r
239 QString path = ui->locationField->text();
\r
240 setCurrentFolder(path);
\r
242 ui->locationField->blockSignals(false);
\r
245 void FolderPanel::on_directoryChanged(QString)
\r
247 int row = ui->fileTable->currentRow();
\r
248 this->setCurrentFolder(m_dir.absolutePath());
\r
249 if (row >= ui->fileTable->rowCount()) {
\r
250 row = ui->fileTable->rowCount() - 1;
\r
252 ui->fileTable->selectRow(row);
\r
255 void FolderPanel::on_fileTable_itemSelectionChanged()
\r
257 if (isUpdating()) {
\r
261 int row = ui->fileTable->currentRow();
\r
262 if (0 <= row && row < ui->fileTable->rowCount()) {
\r
263 getMainWnd()->setStatusText(ui->fileTable->item(row, 1)->text());
\r