OSDN Git Service

ファイルテーブルをサブクラス化、マーク処理見直し、マーク状態表示追加、ファイルサイズ表示変更。
authorMasayuki Satoh <miyabi.satoh@gmail.com>
Mon, 18 Aug 2014 05:00:58 +0000 (14:00 +0900)
committerMasayuki Satoh <miyabi.satoh@gmail.com>
Mon, 18 Aug 2014 05:00:58 +0000 (14:00 +0900)
Gefu.pro
History.txt [new file with mode: 0644]
common.h
filetablewidget.cpp [new file with mode: 0644]
filetablewidget.h [new file with mode: 0644]
folderpanel.cpp
folderpanel.h
folderpanel.ui
mainwindow.cpp
mainwindow.h

index 8416fad..463312c 100644 (file)
--- a/Gefu.pro
+++ b/Gefu.pro
@@ -23,7 +23,8 @@ SOURCES += main.cpp\
     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
@@ -37,7 +38,8 @@ HEADERS  += mainwindow.h \
     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
@@ -50,7 +52,8 @@ RESOURCES += \
     resource.qrc\r
 \r
 OTHER_FILES += \\r
-    Gefu.rc\r
+    Gefu.rc \\r
+    History.txt\r
 \r
 mac {\r
     ICON = ./images/Gefu.icns\r
diff --git a/History.txt b/History.txt
new file mode 100644 (file)
index 0000000..161096a
--- /dev/null
@@ -0,0 +1,8 @@
+2014.08.XX Ver0.01\r
+    ・名前変更ダイアログ(単一)のレイアウトを修正。\r
+    ・すべて選択等で、カーソル位置が変わらないようにした。\r
+    ・マークしているフォルダ数、ファイル数、合計ファイルサイズの表示を追加。\r
+    ・ファイルサイズを小数点第一位まで表示するようにした。\r
+\r
+2014.08.18 Ver0.00\r
+    ・新規公開\r
index 891bb5f..75f4a81 100644 (file)
--- a/common.h
+++ b/common.h
@@ -6,4 +6,12 @@
 \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
diff --git a/filetablewidget.cpp b/filetablewidget.cpp
new file mode 100644 (file)
index 0000000..21247d2
--- /dev/null
@@ -0,0 +1,271 @@
+#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
diff --git a/filetablewidget.h b/filetablewidget.h
new file mode 100644 (file)
index 0000000..60c6c68
--- /dev/null
@@ -0,0 +1,21 @@
+#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
index 17ee31e..8d25404 100644 (file)
@@ -1,3 +1,4 @@
+#include "common.h"\r
 #include "folderpanel.h"\r
 #include "mainwindow.h"\r
 #include "ui_folderpanel.h"\r
@@ -8,6 +9,20 @@
 #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
@@ -18,25 +33,16 @@ FolderPanel::FolderPanel(QWidget *parent) :
 {\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
@@ -49,294 +55,19 @@ FolderPanel::~FolderPanel()
     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
@@ -349,14 +80,14 @@ void FolderPanel::setCurrentFolder(const QString &path)
                     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
@@ -383,6 +114,10 @@ void FolderPanel::setCurrentFolder(const QString &path)
         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
@@ -395,6 +130,7 @@ void FolderPanel::setCurrentFolder(const QString &path)
         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
@@ -421,8 +157,8 @@ void FolderPanel::setCurrentFolder(const QString &path)
     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
@@ -443,23 +179,44 @@ void FolderPanel::UninstallWatcher()
     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
@@ -484,12 +241,12 @@ void FolderPanel::on_directoryChanged(QString)
 \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
index 2e0236c..1a9e374 100644 (file)
@@ -6,6 +6,7 @@
 #include <QTableWidget>\r
 #include <QFileIconProvider>\r
 #include <QFileSystemWatcher>\r
+#include "filetablewidget.h"\r
 class MainWindow;\r
 \r
 namespace Ui {\r
@@ -20,8 +21,8 @@ public:
     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
@@ -30,6 +31,10 @@ public:
     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
@@ -37,11 +42,8 @@ private:
     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
index 7b990f6..fd095b8 100644 (file)
@@ -6,8 +6,8 @@
    <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
@@ -47,7 +47,7 @@
     </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
index 0dbb909..35549b2 100644 (file)
@@ -154,7 +154,6 @@ void MainWindow::onActionCommand()
     }\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
@@ -196,24 +195,9 @@ void MainWindow::onActionExec()
         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
@@ -229,7 +213,6 @@ void MainWindow::onActionOpen()
         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
@@ -277,9 +260,15 @@ void MainWindow::onMarkAll()
         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
@@ -299,7 +288,10 @@ void MainWindow::onMarkAllFiles()
         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
@@ -311,6 +303,9 @@ void MainWindow::onMarkAllFiles()
            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
@@ -330,9 +325,15 @@ void MainWindow::onMarkAllOff()
         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
@@ -352,7 +353,10 @@ void MainWindow::onMarkInvert()
         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
@@ -361,6 +365,9 @@ void MainWindow::onMarkInvert()
             item->setCheckState(Qt::Checked);\r
         }\r
     }\r
+    fp->fileTable()->setCurrentIndex(\r
+                fp->fileTable()->model()->index(curRow, 1));\r
+    fp->endUpdate();\r
 }\r
 \r
 ///\r
@@ -375,7 +382,6 @@ void MainWindow::onMarkToggle()
         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
@@ -405,7 +411,6 @@ void MainWindow::onMoveCursorDown()
         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
@@ -425,7 +430,6 @@ void MainWindow::onMoveCursorUp()
         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
@@ -643,6 +647,11 @@ void MainWindow::onViewSwap()
     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
@@ -674,6 +683,11 @@ void MainWindow::onCmdMove()
 \r
 }\r
 \r
+///\r
+/// \brief MainWindow::onCmdCopy\r
+///\r
+/// ファイルをコピーします(Ctrl + C)\r
+///\r
 void MainWindow::onCmdCopy()\r
 {\r
     FolderPanel *fp = activePanel();\r
@@ -705,6 +719,17 @@ void MainWindow::onCmdCopy()
 \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
@@ -887,12 +912,19 @@ void MainWindow::onHelpAbout()
     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
@@ -912,3 +944,20 @@ QStringList MainWindow::selectedItems(FolderPanel *fp)
 \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
index be0cdf4..f30c370 100644 (file)
@@ -70,4 +70,5 @@ private:
     QStringList selectedItems(FolderPanel *fp);\r
 };\r
 \r
+\r
 #endif // MAINWINDOW_H\r