2 #include "filetablemodel.h"
\r
3 #include "folderpanel.h"
\r
4 #include "mainwindow.h"
\r
5 #include "ui_folderpanel.h"
\r
7 #include <QMessageBox>
\r
10 #include <QDateTime>
\r
11 #include <QDesktopServices>
\r
12 #include <QSettings>
\r
14 #include <windows.h>
\r
17 QString FilesizeToString(quint64 size)
\r
19 if (size >= 1024 * 1024 * 1024) {
\r
20 return QString("%1GB").arg(int(10 * size / (1024 * 1024 * 1024)) / 10.0);
\r
22 if (size >= 1024 * 1024) {
\r
23 return QString("%1MB").arg(int(10 * size / (1024 * 1024)) / 10.0);
\r
26 return QString("%1KB").arg(int(10 * size / 1024) / 10.0);
\r
28 return QString("%1B").arg(size);
\r
31 FolderPanel::FolderPanel(QWidget *parent) :
\r
33 ui(new Ui::FolderPanel),
\r
36 m_fsWatcher(new QFileSystemWatcher(this)),
\r
40 ui->fileTable->setModel(new FileTableModel(this));
\r
43 QHeaderView *header = ui->fileTable->horizontalHeader();
\r
44 header->setSectionResizeMode(0, QHeaderView::ResizeToContents);
\r
45 header->setSectionResizeMode(1, QHeaderView::Stretch);
\r
46 header->setSectionResizeMode(2, QHeaderView::ResizeToContents);
\r
47 header->setSectionResizeMode(3, QHeaderView::ResizeToContents);
\r
50 FolderPanel::~FolderPanel()
\r
56 QTableView* FolderPanel::fileTable()
\r
58 return ui->fileTable;
\r
61 const QTableView *FolderPanel::fileTable() const
\r
63 return ui->fileTable;
\r
66 void FolderPanel::setCurrentFolder(const QString &path)
\r
70 getMainWnd()->setStatusText(tr("ファイルリストを更新中..."));
\r
71 QString curDir = m_dir.absolutePath();
\r
72 m_dir.setPath(QDir::cleanPath(path));
\r
73 m_dir.canonicalPath();
\r
75 QFileInfoList list = m_dir.entryInfoList();
\r
78 QMessageBox::critical(
\r
81 tr("フォルダが存在しないか利用できません。"));
\r
82 m_dir.setPath(curDir);
\r
83 ui->locationField->setText(curDir);
\r
84 getMainWnd()->setStatusText(tr("レディ"));
\r
91 // QtはWindowsのシステムファイル属性をうまく判定できていないため、
\r
92 // GetFileAttributes APIを使ってフィルタする
\r
94 showSystem = settings.value(IniKey_ShowSystem, false).toBool();
\r
97 // ui->fileTable->model()->removeRows(0, ui->fileTable->rowCount());
\r
98 // for (int i = 0; i < list.size(); i++) {
\r
99 // QFileInfo info = list.at(i);
\r
100 // if (info.fileName() == ".." && m_dir.isRoot()) {
\r
104 //#ifdef Q_OS_WIN32
\r
105 // DWORD dwFlags = ::GetFileAttributes(info.absoluteFilePath().toStdWString().c_str());
\r
106 // if (!showSystem && dwFlags != DWORD(-1) && (dwFlags & FILE_ATTRIBUTE_SYSTEM)) {
\r
111 // int row = ui->fileTable->rowCount();
\r
112 // ui->fileTable->insertRow(row);
\r
115 // QTableWidgetItem *iName = new QTableWidgetItem(info.fileName());
\r
116 // iName->setFlags(iName->flags() ^ Qt::ItemIsEditable);
\r
117 // if (info.fileName() == "..") {
\r
118 // iName->setIcon(QIcon(":/images/Up.png"));
\r
121 // iName->setIcon(m_IconFactory.icon(info));
\r
123 // ui->fileTable->setItem(row, 1, iName);
\r
127 // if (info.isDir()) {
\r
128 // str = tr("<DIR>");
\r
131 // str = FilesizeToString(info.size());
\r
133 // QTableWidgetItem *iSize = new QTableWidgetItem(str);
\r
134 // iSize->setFlags(iSize->flags() ^ Qt::ItemIsEditable);
\r
135 // iSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
\r
136 // ui->fileTable->setItem(row, 2, iSize);
\r
139 // QTableWidgetItem *iDateTime = new QTableWidgetItem(
\r
140 // info.lastModified().toString("yy/MM/dd hh:mm"));
\r
141 // iDateTime->setFlags(iDateTime->flags() ^ Qt::ItemIsEditable);
\r
142 // ui->fileTable->setItem(row, 3, iDateTime);
\r
144 // // シグナル処理の関係で、チェックボックスは最後に追加する
\r
145 // QTableWidgetItem *iCheck = new QTableWidgetItem(tr(""));
\r
146 // iCheck->setFlags(iCheck->flags() ^ Qt::ItemIsEditable);
\r
147 // if (info.fileName() != "..") {
\r
148 // iCheck->setFlags(iCheck->flags() | Qt::ItemIsUserCheckable);
\r
149 // iCheck->setCheckState(Qt::Unchecked);
\r
151 // ui->fileTable->setItem(row, 0, iCheck);
\r
154 ui->fileTable->selectRow(0);
\r
155 ui->fileTable->resizeRowsToContents();
\r
157 ui->locationField->setText(m_dir.absolutePath());
\r
158 getMainWnd()->setStatusText(tr("レディ"));
\r
162 void FolderPanel::InstallWatcher()
\r
164 UninstallWatcher();
\r
166 m_fsWatcher = new QFileSystemWatcher(this);
\r
167 m_fsWatcher->addPath(m_dir.absolutePath());
\r
168 connect(m_fsWatcher, SIGNAL(directoryChanged(QString)),
\r
169 this, SLOT(on_directoryChanged(QString)));
\r
172 void FolderPanel::UninstallWatcher()
\r
174 if (m_fsWatcher != NULL) {
\r
175 delete m_fsWatcher;
\r
177 m_fsWatcher = NULL;
\r
180 const QString FolderPanel::side() const
\r
182 return ui->fileTable->side();
\r
185 void FolderPanel::setSide(const QString &side)
\r
187 ui->fileTable->setSide(side);
\r
189 QSettings settings;
\r
190 FileTableModel *model = new FileTableModel();
\r
191 connect(model, SIGNAL(rootChanged(QString)),
\r
192 ui->locationField, SLOT(setText(QString)));
\r
193 connect(model, SIGNAL(stateChanged(int,int,quint64)),
\r
194 this, SLOT(onStateChanged(int,int,quint64)));
\r
197 model->setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);
\r
198 if (settings.value(IniKey_ShowHidden, false).toBool()) {
\r
199 model->setFilter(model->filter() | QDir::Hidden);
\r
201 if (settings.value(IniKey_ShowSystem, false).toBool()) {
\r
202 model->setFilter(model->filter() | QDir::System);
\r
205 model->setSorting(QDir::Name); // 0
\r
206 int sortBy = settings.value(side + slash + IniKey_SortBy, SortByName).toInt();
\r
208 case SortByDate: model->setSorting(model->sorting() | QDir::Time); break;
\r
209 case SortBySize: model->setSorting(model->sorting() | QDir::Size); break;
\r
210 case SortByType: model->setSorting(model->sorting() | QDir::Type); break;
\r
211 default: model->setSorting(model->sorting() | QDir::Name); break;
\r
213 // デフォルトだと文字列は昇順で、数値は降順…orz
\r
214 int orderBy = settings.value(side + slash + IniKey_OrderBy, OrderByDesc).toInt();
\r
215 if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||
\r
216 ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))
\r
218 model->setSorting(model->sorting() | QDir::Reversed);
\r
221 switch (settings.value(side + slash + IniKey_PutDirs, PutDirsFirst).toInt()) {
\r
222 case PutDirsFirst: model->setSorting(model->sorting() | QDir::DirsFirst); break;
\r
223 case PutDirsLast: model->setSorting(model->sorting() | QDir::DirsLast); break;
\r
226 if (settings.value(side + slash + IniKey_IgnoreCase, true).toBool()) {
\r
227 model->setSorting(model->sorting() | QDir::IgnoreCase);
\r
230 QString key = side + slash + IniKey_Dir;
\r
231 QString path = settings.value(key, QDir::homePath()).toString();
\r
232 model->setPath(path);
\r
234 ui->fileTable->setModel(model);
\r
235 ui->fileTable->selectRow(0);
\r
236 ui->fileTable->resizeColumnsToContents();
\r
237 ui->fileTable->resizeRowsToContents();
\r
240 void FolderPanel::onStateChanged(int checkedFolders, int checkedFiles, quint64 totalSize)
\r
243 if (checkedFolders > 0) {
\r
244 msg += tr("%1個のフォルダ ").arg(checkedFolders);
\r
246 if (checkedFiles > 0) {
\r
247 msg += tr("%1個のファイル ").arg(checkedFiles);
\r
249 if (msg.length() > 0) {
\r
251 msg += FilesizeToString(totalSize);
\r
254 ui->label->setText(msg);
\r
258 void FolderPanel::on_locationField_editingFinished()
\r
260 ui->locationField->blockSignals(true);
\r
262 QString path = ui->locationField->text();
\r
263 setCurrentFolder(path);
\r
265 ui->locationField->blockSignals(false);
\r
268 void FolderPanel::on_directoryChanged(QString)
\r
270 // int row = ui->fileTable->currentRow();
\r
271 // this->setCurrentFolder(m_dir.absolutePath());
\r
272 // if (row >= ui->fileTable->rowCount()) {
\r
273 // row = ui->fileTable->rowCount() - 1;
\r
275 // ui->fileTable->selectRow(row);
\r
278 //void FolderPanel::on_fileTable_itemSelectionChanged()
\r
280 // if (isUpdating()) {
\r
284 // int row = ui->fileTable->currentRow();
\r
285 // if (0 <= row && row < ui->fileTable->rowCount()) {
\r
286 // getMainWnd()->setStatusText(ui->fileTable->item(row, 1)->text());
\r