OSDN Git Service

TableView-Modelに変更(高速化)
[gefu/Gefu.git] / folderpanel.cpp
1 #include "common.h"\r
2 #include "filetablemodel.h"\r
3 #include "folderpanel.h"\r
4 #include "mainwindow.h"\r
5 #include "ui_folderpanel.h"\r
6 #include <QCheckBox>\r
7 #include <QMessageBox>\r
8 #include <QKeyEvent>\r
9 #include <QDebug>\r
10 #include <QDateTime>\r
11 #include <QDesktopServices>\r
12 #include <QSettings>\r
13 #ifdef Q_OS_WIN32\r
14     #include <windows.h>\r
15 #endif\r
16 \r
17 QString FilesizeToString(quint64 size)\r
18 {\r
19     if (size >= 1024 * 1024 * 1024) {\r
20         return QString("%1GB").arg(int(10 * size / (1024 * 1024 * 1024)) / 10.0);\r
21     }\r
22     if (size >= 1024 * 1024) {\r
23         return QString("%1MB").arg(int(10 * size / (1024 * 1024)) / 10.0);\r
24     }\r
25     if (size >= 1024) {\r
26         return QString("%1KB").arg(int(10 * size / 1024) / 10.0);\r
27     }\r
28     return QString("%1B").arg(size);\r
29 }\r
30 \r
31 FolderPanel::FolderPanel(QWidget *parent) :\r
32     QWidget(parent),\r
33     ui(new Ui::FolderPanel)\r
34 {\r
35     ui->setupUi(this);\r
36     ui->fileTable->setModel(new FileTableModel(this));\r
37 \r
38     // リサイズ時の動作を設定する\r
39     QHeaderView *header = ui->fileTable->horizontalHeader();\r
40     header->setSectionResizeMode(0, QHeaderView::ResizeToContents);\r
41     header->setSectionResizeMode(1, QHeaderView::Stretch);\r
42     header->setSectionResizeMode(2, QHeaderView::ResizeToContents);\r
43     header->setSectionResizeMode(3, QHeaderView::ResizeToContents);\r
44 \r
45     header->setDefaultSectionSize(header->minimumSectionSize());\r
46 }\r
47 \r
48 FolderPanel::~FolderPanel()\r
49 {\r
50     delete ui;\r
51 }\r
52 \r
53 QTableView* FolderPanel::fileTable()\r
54 {\r
55     return ui->fileTable;\r
56 }\r
57 \r
58 const QTableView *FolderPanel::fileTable() const\r
59 {\r
60     return ui->fileTable;\r
61 }\r
62 \r
63 const QString FolderPanel::side() const\r
64 {\r
65     return ui->fileTable->side();\r
66 }\r
67 \r
68 void FolderPanel::setSide(const QString &side)\r
69 {\r
70     ui->fileTable->setSide(side);\r
71 \r
72     QSettings settings;\r
73     FileTableModel *model = new FileTableModel();\r
74     connect(model, SIGNAL(rootChanged(QString)),\r
75             ui->locationField, SLOT(setText(QString)));\r
76     connect(model, SIGNAL(stateChanged(int,int,quint64)),\r
77             this, SLOT(onStateChanged(int,int,quint64)));\r
78 \r
79     //>>>>> フィルタ初期化\r
80     model->setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);\r
81     if (settings.value(IniKey_ShowHidden, false).toBool()) {\r
82         model->setFilter(model->filter() | QDir::Hidden);\r
83     }\r
84     if (settings.value(IniKey_ShowSystem, false).toBool()) {\r
85         model->setFilter(model->filter() | QDir::System);\r
86     }\r
87     //>>>>> ソート順初期化\r
88     model->setSorting(QDir::Name);  // 0\r
89     int sortBy = settings.value(side + slash + IniKey_SortBy, SortByName).toInt();\r
90     switch (sortBy) {\r
91     case SortByDate:    model->setSorting(model->sorting() | QDir::Time); break;\r
92     case SortBySize:    model->setSorting(model->sorting() | QDir::Size); break;\r
93     case SortByType:    model->setSorting(model->sorting() | QDir::Type); break;\r
94     default:            model->setSorting(model->sorting() | QDir::Name); break;\r
95     }\r
96     // デフォルトだと文字列は昇順で、数値は降順…orz\r
97     int orderBy = settings.value(side + slash + IniKey_OrderBy, OrderByDesc).toInt();\r
98     if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
99         ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
100     {\r
101         model->setSorting(model->sorting() | QDir::Reversed);\r
102     }\r
103     // フォルダの位置\r
104     switch (settings.value(side + slash + IniKey_PutDirs, PutDirsFirst).toInt()) {\r
105     case PutDirsFirst:  model->setSorting(model->sorting() | QDir::DirsFirst); break;\r
106     case PutDirsLast:   model->setSorting(model->sorting() | QDir::DirsLast); break;\r
107     }\r
108     // 大文字小文字の区別\r
109     if (settings.value(side + slash + IniKey_IgnoreCase, true).toBool()) {\r
110         model->setSorting(model->sorting() | QDir::IgnoreCase);\r
111     }\r
112     //>>>>> 監視フォルダ初期化\r
113     QString key = side + slash + IniKey_Dir;\r
114     QString path = settings.value(key, QDir::homePath()).toString();\r
115     model->setPath(path);\r
116 \r
117     ui->fileTable->setModel(model);\r
118     ui->fileTable->selectRow(0);\r
119     ui->fileTable->resizeColumnsToContents();\r
120     ui->fileTable->resizeRowsToContents();\r
121 }\r
122 \r
123 void FolderPanel::onStateChanged(int checkedFolders, int checkedFiles, quint64 totalSize)\r
124 {\r
125     QString msg = "";\r
126     if (checkedFolders > 0) {\r
127         msg += tr("%1個のフォルダ ").arg(checkedFolders);\r
128     }\r
129     if (checkedFiles > 0) {\r
130         msg += tr("%1個のファイル ").arg(checkedFiles);\r
131     }\r
132     if (msg.length() > 0) {\r
133         msg += "を選択 合計 ";\r
134         msg += FilesizeToString(totalSize);\r
135     }\r
136 \r
137     ui->label->setText(msg);\r
138 \r
139 }\r
140 \r
141 void FolderPanel::on_locationField_editingFinished()\r
142 {\r
143     ui->locationField->blockSignals(true);\r
144 \r
145     QString path = ui->locationField->text();\r
146     ui->fileTable->setRootPath(path);\r
147 \r
148     ui->locationField->blockSignals(false);\r
149 }\r