renameworker.cpp \\r
deleteworker.cpp \\r
overwritedialog.cpp \\r
- copymoveworker.cpp\r
+ copymoveworker.cpp \\r
+ filetablewidget.cpp\r
\r
HEADERS += mainwindow.h \\r
folderpanel.h \\r
renameworker.h \\r
deleteworker.h \\r
overwritedialog.h \\r
- copymoveworker.h\r
+ copymoveworker.h \\r
+ filetablewidget.h\r
\r
FORMS += mainwindow.ui \\r
folderpanel.ui \\r
resource.qrc\r
\r
OTHER_FILES += \\r
- Gefu.rc\r
+ Gefu.rc \\r
+ History.txt\r
\r
mac {\r
ICON = ./images/Gefu.icns\r
--- /dev/null
+2014.08.XX Ver0.01\r
+ ・名前変更ダイアログ(単一)のレイアウトを修正。\r
+ ・すべて選択等で、カーソル位置が変わらないようにした。\r
+ ・マークしているフォルダ数、ファイル数、合計ファイルサイズの表示を追加。\r
+ ・ファイルサイズを小数点第一位まで表示するようにした。\r
+\r
+2014.08.18 Ver0.00\r
+ ・新規公開\r
\r
typedef QMap<QString, QString> StringMap;\r
\r
+class MainWindow;\r
+extern MainWindow* getMainWnd();\r
+\r
+extern QString FilesizeToString(quint64 size);\r
+\r
+#define VERSION_STRING "0.01"\r
+#define VERSION_VALUE 0.01\r
+\r
#endif // COMMON_H\r
--- /dev/null
+#include "common.h"\r
+#include "mainwindow.h"\r
+#include "filetablewidget.h"\r
+#include <QKeyEvent>\r
+#include <QHeaderView>\r
+\r
+FileTableWidget::FileTableWidget(QWidget *parent) :\r
+ QTableWidget(parent)\r
+{\r
+ connect(this, SIGNAL(cellChanged(int,int)), this, SLOT(onCellChanged(int,int)));\r
+\r
+ // ダブルクリック → 開く\r
+ MainWindow *mainWnd = getMainWnd();\r
+ connect(this, SIGNAL(cellDoubleClicked(int,int)), mainWnd, SLOT(onActionOpen()));\r
+}\r
+\r
+void FileTableWidget::keyPressEvent(QKeyEvent *event)\r
+{\r
+ bool accepted = false;\r
+ switch (event->key()) {\r
+ case Qt::Key_A:\r
+ // A すべてのファイルをマーク\r
+ // Shift + A すべてマーク\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onMarkAllFiles();\r
+ accepted = true;\r
+ }\r
+ else if (event->modifiers() == Qt::ShiftModifier) {\r
+ getMainWnd()->onMarkAll();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_C:\r
+ // Ctrl + C ファイルをコピー\r
+ if (event->modifiers() == Qt::ControlModifier) {\r
+ getMainWnd()->onCmdCopy();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_D:\r
+ // Ctrl + D ファイルを削除\r
+ if (event->modifiers() == Qt::ControlModifier) {\r
+ getMainWnd()->onCmdDelete();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_E:\r
+ // E エディタで開く\r
+ // Ctrl + E ファイルを作成\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ }\r
+ else if (event->modifiers() == Qt::ControlModifier) {\r
+ getMainWnd()->onCmdNewFile();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_G:\r
+ // G カーソルを先頭に移動\r
+ // Shift + G カーソルを末尾に移動\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onMoveCursorBegin();\r
+ accepted = true;\r
+ }\r
+ else if (event->modifiers() == Qt::ShiftModifier) {\r
+ getMainWnd()->onMoveCursorEnd();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_H:\r
+ // H ホームフォルダに移動\r
+ // Shift + H 隠しファイルを表示/非表示\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onMoveHome();\r
+ accepted = true;\r
+ }\r
+ else if (event->modifiers() == Qt::ShiftModifier) {\r
+ getMainWnd()->onViewHidden();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_I:\r
+ // I マークを反転\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onMarkInvert();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_J:\r
+ // J カーソルを下に移動\r
+ // Shift + J フォルダを選択して移動\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onMoveCursorDown();\r
+ accepted = true;\r
+ }\r
+ else if (event->modifiers() == Qt::ShiftModifier) {\r
+ getMainWnd()->onMoveJump();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_K:\r
+ // K カーソルを上に移動\r
+ // Ctrl + K フォルダを作成\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onMoveCursorUp();\r
+ accepted = true;\r
+ }\r
+ else if (event->modifiers() == Qt::ControlModifier) {\r
+ getMainWnd()->onCmdNewFolder();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_M:\r
+ // M 開く\r
+ // Shift + M アプリケーションで開く\r
+ // Ctrl + M ファイルの移動\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onActionOpen();\r
+ accepted = true;\r
+ }\r
+ else if (event->modifiers() == Qt::ShiftModifier) {\r
+ getMainWnd()->onActionExec();\r
+ accepted = true;\r
+ }\r
+ else if (event->modifiers() == Qt::ControlModifier) {\r
+ getMainWnd()->onCmdMove();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_O:\r
+ // O 隣のパネルと同じフォルダを表示\r
+ // Shift + O 隣のパネルに同じフォルダを表示\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onViewFromOther();\r
+ accepted = true;\r
+ }\r
+ else if (event->modifiers() == Qt::ShiftModifier) {\r
+ getMainWnd()->onViewToOther();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_Q:\r
+ // Q アプリケーションを終了\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onActionQuit();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_R:\r
+ // R 履歴を表示\r
+ // Ctrl + R 名前を変更\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ }\r
+ else if (event->modifiers() == Qt::ControlModifier) {\r
+ getMainWnd()->onCmdRename();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_U:\r
+ // U すべてのマークを解除\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onMarkAllOff();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_W:\r
+ // W 表示フォルダを交換\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onViewSwap();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_X:\r
+ // X コマンドを実行\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onActionCommand();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_Question:\r
+ // ? アプリケーション情報を表示\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onHelpAbout();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_Space:\r
+ // マーク/解除\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onMarkToggle();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_Tab:\r
+ // 隣のパネルに移動\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onMoveOther();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_Backspace:\r
+ // BS 親フォルダに移動\r
+ // Shift + BS ルートフォルダに移動\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onMoveParent();\r
+ accepted = true;\r
+ }\r
+ else if (event->modifiers() == Qt::ShiftModifier) {\r
+ getMainWnd()->onMoveRoot();\r
+ accepted = true;\r
+ }\r
+ break;\r
+\r
+ case Qt::Key_Return:\r
+ // RET 開く\r
+ // Shift + RET アプリケーションで開く\r
+ if (event->modifiers() == Qt::NoModifier) {\r
+ getMainWnd()->onActionOpen();\r
+ accepted = true;\r
+ }\r
+ else if (event->modifiers() == Qt::ShiftModifier) {\r
+ getMainWnd()->onActionExec();\r
+ accepted = true;\r
+ }\r
+ break;\r
+ }\r
+\r
+ if (accepted) {\r
+ event->accept();\r
+ }\r
+ else {\r
+ QTableWidget::keyPressEvent(event);\r
+ }\r
+}\r
+\r
+void FileTableWidget::onCellChanged(int row, int column)\r
+{\r
+ if (column == 0) { // マーク状態が変更された\r
+ if (item(row, 0)->checkState() == Qt::Checked) {\r
+ for (int n = 0; n < 4; n++) {\r
+ item(row, n)->setForeground(Qt::red);\r
+ item(row, n)->setBackground(Qt::green);\r
+ }\r
+ }\r
+ else {\r
+ for (int n = 0; n < 4; n++) {\r
+ item(row, n)->setForeground(Qt::black);\r
+ item(row, n)->setBackground(Qt::white);\r
+ }\r
+ }\r
+ selectRow(row);\r
+ }\r
+}\r
--- /dev/null
+#ifndef FILETABLEWIDGET_H\r
+#define FILETABLEWIDGET_H\r
+\r
+#include <QTableWidget>\r
+\r
+class FileTableWidget : public QTableWidget\r
+{\r
+ Q_OBJECT\r
+public:\r
+ explicit FileTableWidget(QWidget *parent = 0);\r
+\r
+signals:\r
+\r
+public slots:\r
+ void onCellChanged(int row, int column);\r
+\r
+protected:\r
+ void keyPressEvent(QKeyEvent *event);\r
+};\r
+\r
+#endif // FILETABLEWIDGET_H\r
+#include "common.h"\r
#include "folderpanel.h"\r
#include "mainwindow.h"\r
#include "ui_folderpanel.h"\r
#include <QDateTime>\r
#include <QDesktopServices>\r
\r
+QString FilesizeToString(quint64 size)\r
+{\r
+ if (size >= 1024 * 1024 * 1024) {\r
+ return QString("%1GB").arg(int(10 * size / (1024 * 1024 * 1024)) / 10.0);\r
+ }\r
+ if (size >= 1024 * 1024) {\r
+ return QString("%1MB").arg(int(10 * size / (1024 * 1024)) / 10.0);\r
+ }\r
+ if (size >= 1024) {\r
+ return QString("%1KB").arg(int(10 * size / 1024) / 10.0);\r
+ }\r
+ return QString("%1B").arg(size);\r
+}\r
+\r
FolderPanel::FolderPanel(QWidget *parent) :\r
QWidget(parent),\r
ui(new Ui::FolderPanel),\r
{\r
ui->setupUi(this);\r
\r
- // MainWindowのスロットに接続する\r
- MainWindow *mainWnd = this->mainWindow();\r
- if (mainWnd) {\r
- connect(ui->fileTable, SIGNAL(cellDoubleClicked(int,int)), mainWnd, SLOT(onActionOpen()));\r
- }\r
-\r
- // ヘッダーラベルを設定する\r
- QStringList labels;\r
- labels << tr("") << tr("名前") << tr("サイズ") << tr("更新日時");\r
- ui->fileTable->setHorizontalHeaderLabels(labels);\r
-\r
- // イベントフィルタを設定する\r
- ui->fileTable->installEventFilter(this);\r
+ // セル(チェックボックス)の変更\r
+ connect(ui->fileTable, SIGNAL(cellChanged(int,int)),\r
+ this, SLOT(onUpdateMark(int,int)));\r
\r
// リサイズ時の動作を設定する\r
- ui->fileTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);\r
- ui->fileTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);\r
- ui->fileTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents);\r
- ui->fileTable->horizontalHeader()->setSectionResizeMode(3, QHeaderView::ResizeToContents);\r
+ QHeaderView *header = ui->fileTable->horizontalHeader();\r
+ header->setSectionResizeMode(0, QHeaderView::ResizeToContents);\r
+ header->setSectionResizeMode(1, QHeaderView::Stretch);\r
+ header->setSectionResizeMode(2, QHeaderView::ResizeToContents);\r
+ header->setSectionResizeMode(3, QHeaderView::ResizeToContents);\r
\r
// フォルダの要素を表示\r
m_dir.setFilter(QDir::NoDot | QDir::AllEntries);\r
delete ui;\r
}\r
\r
-QTableWidget* FolderPanel::fileTable()\r
+FileTableWidget* FolderPanel::fileTable()\r
{\r
return ui->fileTable;\r
}\r
\r
-const QTableWidget* FolderPanel::fileTable() const\r
+const FileTableWidget *FolderPanel::fileTable() const\r
{\r
return ui->fileTable;\r
}\r
\r
-MainWindow* FolderPanel::mainWindow()\r
-{\r
- foreach (QWidget *w, qApp->topLevelWidgets()) {\r
- if (w->objectName() == "MainWindow") {\r
- return static_cast<MainWindow*>(w);\r
- }\r
- }\r
- return NULL;\r
-}\r
-\r
-bool FolderPanel::eventFilter(QObject *obj, QEvent *event)\r
-{\r
- if (this->mainWindow() && event->type() == QEvent::KeyPress) {\r
- QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);\r
- switch (keyEvent->key()) {\r
- case Qt::Key_A:\r
- // A すべてのファイルをマーク\r
- // Shift + A すべてマーク\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onMarkAllFiles();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- else if (keyEvent->modifiers() == Qt::ShiftModifier) {\r
- this->mainWindow()->onMarkAll();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_C:\r
- // Ctrl + C ファイルをコピー\r
- if (keyEvent->modifiers() == Qt::ControlModifier) {\r
- this->mainWindow()->onCmdCopy();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_D:\r
- // Ctrl + D ファイルを削除\r
- if (keyEvent->modifiers() == Qt::ControlModifier) {\r
- this->mainWindow()->onCmdDelete();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_E:\r
- // E エディタで開く\r
- // Ctrl + E ファイルを作成\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- }\r
- else if (keyEvent->modifiers() == Qt::ControlModifier) {\r
- this->mainWindow()->onCmdNewFile();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_G:\r
- // G カーソルを先頭に移動\r
- // Shift + G カーソルを末尾に移動\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onMoveCursorBegin();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- else if (keyEvent->modifiers() == Qt::ShiftModifier) {\r
- this->mainWindow()->onMoveCursorEnd();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_H:\r
- // H ホームフォルダに移動\r
- // Shift + H 隠しファイルを表示/非表示\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onMoveHome();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- else if (keyEvent->modifiers() == Qt::ShiftModifier) {\r
- this->mainWindow()->onViewHidden();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_I:\r
- // I マークを反転\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onMarkInvert();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_J:\r
- // J カーソルを下に移動\r
- // Shift + J フォルダを選択して移動\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onMoveCursorDown();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- else if (keyEvent->modifiers() == Qt::ShiftModifier) {\r
- this->mainWindow()->onMoveJump();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_K:\r
- // K カーソルを上に移動\r
- // Ctrl + K フォルダを作成\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onMoveCursorUp();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- else if (keyEvent->modifiers() == Qt::ControlModifier) {\r
- this->mainWindow()->onCmdNewFolder();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_M:\r
- // M 開く\r
- // Shift + M アプリケーションで開く\r
- // Ctrl + M ファイルの移動\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onActionOpen();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- else if (keyEvent->modifiers() == Qt::ShiftModifier) {\r
- this->mainWindow()->onActionExec();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- else if (keyEvent->modifiers() == Qt::ControlModifier) {\r
- this->mainWindow()->onCmdMove();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_O:\r
- // O 隣のパネルと同じフォルダを表示\r
- // Shift + O 隣のパネルに同じフォルダを表示\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onViewFromOther();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- else if (keyEvent->modifiers() == Qt::ShiftModifier) {\r
- this->mainWindow()->onViewToOther();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_Q:\r
- // Q アプリケーションを終了\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onActionQuit();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_R:\r
- // R 履歴を表示\r
- // Ctrl + R 名前を変更\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- }\r
- else if (keyEvent->modifiers() == Qt::ControlModifier) {\r
- this->mainWindow()->onCmdRename();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_U:\r
- // U すべてのマークを解除\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onMarkAllOff();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_W:\r
- // W 表示フォルダを交換\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onViewSwap();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_X:\r
- // X コマンドを実行\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onActionCommand();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_Question:\r
- // ? アプリケーション情報を表示\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onHelpAbout();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_Space:\r
- // マーク/解除\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onMarkToggle();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_Tab:\r
- // 隣のパネルに移動\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onMoveOther();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_Backspace:\r
- // BS 親フォルダに移動\r
- // Shift + BS ルートフォルダに移動\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onMoveParent();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- else if (keyEvent->modifiers() == Qt::ShiftModifier) {\r
- this->mainWindow()->onMoveRoot();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
-\r
- case Qt::Key_Return:\r
- // RET 開く\r
- // Shift + RET アプリケーションで開く\r
- if (keyEvent->modifiers() == Qt::NoModifier) {\r
- this->mainWindow()->onActionOpen();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- else if (keyEvent->modifiers() == Qt::ShiftModifier) {\r
- this->mainWindow()->onActionExec();\r
- keyEvent->accept();\r
- return true;\r
- }\r
- break;\r
- }\r
- }\r
-\r
- return QWidget::eventFilter(obj, event);\r
-}\r
-\r
void FolderPanel::setCurrentFolder(const QString &path)\r
{\r
- mainWindow()->setStatusText(tr("ファイルリストを更新中..."));\r
+ getMainWnd()->setStatusText(tr("ファイルリストを更新中..."));\r
QString curDir = m_dir.absolutePath();\r
m_dir.setPath(QDir::cleanPath(path));\r
m_dir.canonicalPath();\r
tr("フォルダが存在しないか利用できません。"));\r
m_dir.setPath(curDir);\r
ui->locationField->setText(curDir);\r
- mainWindow()->setStatusText(tr("レディ"));\r
+ getMainWnd()->setStatusText(tr("レディ"));\r
return;\r
}\r
\r
// フォルダの変更監視\r
InstallWatcher();\r
\r
- m_bUpdating = true;\r
+ beginUpdate();\r
ui->fileTable->model()->removeRows(0, ui->fileTable->rowCount());\r
for (int i = 0; i < list.size(); i++) {\r
QFileInfo info = list.at(i);\r
if (info.isDir()) {\r
str = tr("<DIR>");\r
}\r
+ else {\r
+ str = FilesizeToString(info.size());\r
+ }\r
+#if 0\r
else if (info.size() >= 1024 * 1024 * 1024) {\r
str = tr("%1GB").arg(int(info.size() / (1024 * 1024 * 1024)));\r
}\r
else {\r
str = tr("%1B").arg(info.size());\r
}\r
+#endif\r
QTableWidgetItem *iSize = new QTableWidgetItem(str);\r
iSize->setFlags(iSize->flags() ^ Qt::ItemIsEditable);\r
iSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
ui->fileTable->resizeRowsToContents();\r
\r
ui->locationField->setText(m_dir.absolutePath());\r
- mainWindow()->setStatusText(tr("レディ"));\r
- m_bUpdating = false;\r
+ getMainWnd()->setStatusText(tr("レディ"));\r
+ endUpdate();\r
}\r
\r
void FolderPanel::InstallWatcher()\r
m_fsWatcher = NULL;\r
}\r
\r
-void FolderPanel::on_fileTable_cellChanged(int row, int column)\r
+void FolderPanel::onUpdateMark(int, int column)\r
{\r
- if (column == 0) {\r
- if (ui->fileTable->item(row, 0)->checkState() == Qt::Checked) {\r
- for (int n = 0; n < 4; n++) {\r
- ui->fileTable->item(row, n)->setForeground(Qt::red);\r
- ui->fileTable->item(row, n)->setBackground(Qt::green);\r
- }\r
+ if (column != 0 || isUpdating()) {\r
+ return;\r
+ }\r
+\r
+ // マークフォルダ数、ファイル数、サイズを計算する\r
+ int numFolders = 0;\r
+ int numFiles = 0;\r
+ quint64 sizeTotal = 0;\r
+ for (int n = 0; n < ui->fileTable->rowCount(); n++) {\r
+ if (ui->fileTable->item(n, 0)->checkState() != Qt::Checked) {\r
+ continue;\r
+ }\r
+ QString name = ui->fileTable->item(n, 1)->text();\r
+ QFileInfo info(m_dir.absoluteFilePath(name));\r
+ if (info.isDir()) {\r
+ numFolders++;\r
}\r
else {\r
- for (int n = 0; n < 4; n++) {\r
- ui->fileTable->item(row, n)->setForeground(Qt::black);\r
- ui->fileTable->item(row, n)->setBackground(Qt::white);\r
- }\r
+ numFiles++;\r
+ sizeTotal += info.size();\r
}\r
- ui->fileTable->selectRow(row);\r
}\r
+\r
+ QString msg = "";\r
+ if (numFolders > 0) {\r
+ msg += tr("%1個のフォルダ ").arg(numFolders);\r
+ }\r
+ if (numFiles > 0) {\r
+ msg += tr("%1個のファイル ").arg(numFiles);\r
+ }\r
+ if (msg.length() > 0) {\r
+ msg += "を選択 合計 ";\r
+ msg += FilesizeToString(sizeTotal);\r
+ }\r
+\r
+ ui->label->setText(msg);\r
}\r
\r
void FolderPanel::on_locationField_editingFinished()\r
\r
void FolderPanel::on_fileTable_itemSelectionChanged()\r
{\r
- if (m_bUpdating) {\r
+ if (isUpdating()) {\r
return;\r
}\r
\r
int row = ui->fileTable->currentRow();\r
if (0 <= row && row < ui->fileTable->rowCount()) {\r
- mainWindow()->setStatusText(ui->fileTable->item(row, 1)->text());\r
+ getMainWnd()->setStatusText(ui->fileTable->item(row, 1)->text());\r
}\r
}\r
#include <QTableWidget>\r
#include <QFileIconProvider>\r
#include <QFileSystemWatcher>\r
+#include "filetablewidget.h"\r
class MainWindow;\r
\r
namespace Ui {\r
explicit FolderPanel(QWidget *parent = 0);\r
~FolderPanel();\r
\r
- QTableWidget* fileTable();\r
- const QTableWidget* fileTable() const;\r
+ FileTableWidget* fileTable();\r
+ const FileTableWidget* fileTable() const;\r
\r
QDir* dir() { return &m_dir; }\r
const QDir* dir() const { return &m_dir; }\r
void InstallWatcher();\r
void UninstallWatcher();\r
\r
+ void beginUpdate() { m_bUpdating = true; }\r
+ void endUpdate() { m_bUpdating = false; onUpdateMark(0, 0);}\r
+ bool isUpdating() const { return m_bUpdating; }\r
+\r
private:\r
Ui::FolderPanel *ui;\r
QDir m_dir;\r
QFileSystemWatcher *m_fsWatcher;\r
bool m_bUpdating;\r
\r
- MainWindow* mainWindow();\r
- bool eventFilter(QObject *, QEvent *);\r
-\r
private slots:\r
- void on_fileTable_cellChanged(int row, int column);\r
+ void onUpdateMark(int, int);\r
void on_locationField_editingFinished();\r
void on_directoryChanged(QString);\r
void on_fileTable_itemSelectionChanged();\r
<rect>\r
<x>0</x>\r
<y>0</y>\r
- <width>280</width>\r
- <height>275</height>\r
+ <width>256</width>\r
+ <height>238</height>\r
</rect>\r
</property>\r
<property name="sizePolicy">\r
</layout>\r
</item>\r
<item>\r
- <widget class="QTableWidget" name="fileTable">\r
+ <widget class="FileTableWidget" name="fileTable">\r
<property name="horizontalScrollBarPolicy">\r
<enum>Qt::ScrollBarAlwaysOff</enum>\r
</property>\r
<attribute name="verticalHeaderVisible">\r
<bool>false</bool>\r
</attribute>\r
- <column/>\r
- <column/>\r
- <column/>\r
- <column/>\r
+ <column>\r
+ <property name="text">\r
+ <string/>\r
+ </property>\r
+ </column>\r
+ <column>\r
+ <property name="text">\r
+ <string>名前</string>\r
+ </property>\r
+ </column>\r
+ <column>\r
+ <property name="text">\r
+ <string>サイズ</string>\r
+ </property>\r
+ </column>\r
+ <column>\r
+ <property name="text">\r
+ <string>更新日時</string>\r
+ </property>\r
+ </column>\r
</widget>\r
</item>\r
<item>\r
</item>\r
</layout>\r
</widget>\r
+ <customwidgets>\r
+ <customwidget>\r
+ <class>FileTableWidget</class>\r
+ <extends>QTableWidget</extends>\r
+ <header>filetablewidget.h</header>\r
+ </customwidget>\r
+ </customwidgets>\r
<tabstops>\r
<tabstop>fileTable</tabstop>\r
<tabstop>locationField</tabstop>\r
}\r
\r
if (command.isEmpty()) {\r
-// int row = fp->fileTable()->currentIndex().row();\r
int row = fp->fileTable()->currentRow();\r
QString path = fp->fileTable()->item(row, 1)->text();\r
path = fp->dir()->absoluteFilePath(path);\r
return;\r
}\r
\r
- int count = 0;\r
- for (int n = 0; n < fp->fileTable()->rowCount(); n++) {\r
- if (fp->fileTable()->item(n, 0)->checkState() == Qt::Checked) {\r
- QString path = fp->fileTable()->item(n, 1)->text();\r
- path = fp->dir()->absoluteFilePath(path);\r
- path = QDir::toNativeSeparators(path);\r
- QDesktopServices::openUrl(QUrl("file:///" + path));\r
- count++;\r
- }\r
- }\r
-\r
- if (count == 0) {\r
-// int row = fp->fileTable()->currentIndex().row();\r
- int row = fp->fileTable()->currentRow();\r
- QString path = fp->fileTable()->item(row, 1)->text();\r
- path = fp->dir()->absoluteFilePath(path);\r
- path = QDir::toNativeSeparators(path);\r
- QDesktopServices::openUrl(QUrl("file:///" + path));\r
+ QStringList list = selectedItems(fp);\r
+ foreach (const QString &path, list) {\r
+ QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(path)));\r
}\r
}\r
\r
return;\r
}\r
\r
-// int row = fp->fileTable()->currentIndex().row();\r
int row = fp->fileTable()->currentRow();\r
QString path = fp->fileTable()->item(row, 1)->text();\r
path = fp->dir()->absoluteFilePath(path);\r
row++;\r
}\r
\r
- for (; row < fp->fileTable()->rowCount(); row++) {\r
+ fp->beginUpdate();\r
+ int curRow = fp->fileTable()->currentRow();\r
+ int rowCount = fp->fileTable()->rowCount();\r
+ for (; row < rowCount; row++) {\r
fp->fileTable()->item(row, 0)->setCheckState(Qt::Checked);\r
}\r
+ fp->fileTable()->setCurrentIndex(\r
+ fp->fileTable()->model()->index(curRow, 1));\r
+ fp->endUpdate();\r
}\r
\r
///\r
row++;\r
}\r
\r
- for (; row < fp->fileTable()->rowCount(); row++) {\r
+ fp->beginUpdate();\r
+ int curRow = fp->fileTable()->currentRow();\r
+ int rowCount = fp->fileTable()->rowCount();\r
+ for (; row < rowCount; row++) {\r
QString path = fp->fileTable()->item(row, 1)->text();\r
path = fp->dir()->absoluteFilePath(path);\r
\r
fp->fileTable()->item(row, 0)->setCheckState(Qt::Checked);\r
}\r
}\r
+ fp->fileTable()->setCurrentIndex(\r
+ fp->fileTable()->model()->index(curRow, 1));\r
+ fp->endUpdate();\r
}\r
\r
///\r
row++;\r
}\r
\r
- for (; row < fp->fileTable()->rowCount(); row++) {\r
+ fp->beginUpdate();\r
+ int curRow = fp->fileTable()->currentRow();\r
+ int rowCount = fp->fileTable()->rowCount();\r
+ for (; row < rowCount; row++) {\r
fp->fileTable()->item(row, 0)->setCheckState(Qt::Unchecked);\r
}\r
+ fp->fileTable()->setCurrentIndex(\r
+ fp->fileTable()->model()->index(curRow, 1));\r
+ fp->endUpdate();\r
}\r
\r
///\r
row++;\r
}\r
\r
- for (; row < fp->fileTable()->rowCount(); row++) {\r
+ fp->beginUpdate();\r
+ int curRow = fp->fileTable()->currentRow();\r
+ int rowCount = fp->fileTable()->rowCount();\r
+ for (; row < rowCount; row++) {\r
QTableWidgetItem *item = fp->fileTable()->item(row, 0);\r
if (item->checkState() == Qt::Checked) {\r
item->setCheckState(Qt::Unchecked);\r
item->setCheckState(Qt::Checked);\r
}\r
}\r
+ fp->fileTable()->setCurrentIndex(\r
+ fp->fileTable()->model()->index(curRow, 1));\r
+ fp->endUpdate();\r
}\r
\r
///\r
return;\r
}\r
\r
-// int row = fp->fileTable()->currentIndex().row();\r
int row = fp->fileTable()->currentRow();\r
QTableWidgetItem *item = fp->fileTable()->item(row, 0);\r
if (fp->fileTable()->item(row, 1)->text() != "..") {\r
return;\r
}\r
\r
-// int row = fp->fileTable()->currentIndex().row();\r
int row = fp->fileTable()->currentRow();\r
if (row < fp->fileTable()->rowCount() - 1) {\r
QModelIndex nextIndex = fp->fileTable()->model()->index(row + 1, 1);\r
return;\r
}\r
\r
-// int row = fp->fileTable()->currentIndex().row();\r
int row = fp->fileTable()->currentRow();\r
if (row > 0) {\r
QModelIndex nextIndex = fp->fileTable()->model()->index(row - 1, 1);\r
fp2->setCurrentFolder(path1);\r
}\r
\r
+///\r
+/// \brief MainWindow::onCmdMove\r
+///\r
+/// ファイルを移動します(Ctrl + M)\r
+///\r
void MainWindow::onCmdMove()\r
{\r
FolderPanel *fp = activePanel();\r
\r
}\r
\r
+///\r
+/// \brief MainWindow::onCmdCopy\r
+///\r
+/// ファイルをコピーします(Ctrl + C)\r
+///\r
void MainWindow::onCmdCopy()\r
{\r
FolderPanel *fp = activePanel();\r
\r
}\r
\r
+///\r
+/// \brief MainWindow::onAskOverWrite\r
+/// \param bOk\r
+/// \param prevCopyMethod\r
+/// \param copyMethod\r
+/// \param alias\r
+/// \param srcPath\r
+/// \param tgtPath\r
+///\r
+/// 上書き処理の方法をユーザに問い合わせます\r
+///\r
void MainWindow::onAskOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod,\r
QString *alias, const QString srcPath,\r
const QString tgtPath)\r
QMessageBox::about(\r
this,\r
tr("げふぅ について"),\r
- tr("<h3>Gefu Ver0.00</h3>"\r
- "<center>Gefu is Experimental File Utility.<br/>"\r
+ tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +\r
+ tr("<center>Gefu is Experimental File Utility.<br/>"\r
"(げふぅは実験的なファイルユーティリティです)</center>"\r
"<p>Copyright 2014 @miyabi_satoh All rights reserved.</p>"));\r
}\r
\r
+///\r
+/// \brief MainWindow::selectedItems\r
+/// \param fp フォルダパネルへのポインタ\r
+/// \return 選択アイテムのフルパスのリスト\r
+///\r
+/// 選択アイテムのフルパスのリストを取得します\r
+///\r
QStringList MainWindow::selectedItems(FolderPanel *fp)\r
{\r
QStringList list;\r
\r
return list;\r
}\r
+\r
+///\r
+/// \brief getMainWnd\r
+/// \return メインウィンドウのポインタ\r
+///\r
+/// メインウィンドウを取得します\r
+///\r
+MainWindow* getMainWnd()\r
+{\r
+ foreach (QWidget *w, qApp->topLevelWidgets()) {\r
+ if (w->objectName() == "MainWindow") {\r
+ return static_cast<MainWindow*>(w);\r
+ }\r
+ }\r
+ qDebug() << "MainWindow not found !?";\r
+ return NULL;\r
+}\r
QStringList selectedItems(FolderPanel *fp);\r
};\r
\r
+\r
#endif // MAINWINDOW_H\r