OSDN Git Service

Ver0.05
[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 \r
7 #include <QSettings>\r
8 \r
9 QString FilesizeToString(quint64 size)\r
10 {\r
11     if (size >= 1024 * 1024 * 1024) {\r
12         return QString("%1GB").arg(int(10 * size / (1024 * 1024 * 1024)) / 10.0);\r
13     }\r
14     if (size >= 1024 * 1024) {\r
15         return QString("%1MB").arg(int(10 * size / (1024 * 1024)) / 10.0);\r
16     }\r
17     if (size >= 1024) {\r
18         return QString("%1KB").arg(int(10 * size / 1024) / 10.0);\r
19     }\r
20     return QString("%1B").arg(size);\r
21 }\r
22 \r
23 FolderPanel::FolderPanel(QWidget *parent) :\r
24     QWidget(parent),\r
25     ui(new Ui::FolderPanel)\r
26 {\r
27     ui->setupUi(this);\r
28     ui->fileTable->setModel(new FileTableModel(this));\r
29 \r
30     // リサイズ時の動作を設定する\r
31     QHeaderView *header = ui->fileTable->horizontalHeader();\r
32     header->setSectionResizeMode(0, QHeaderView::ResizeToContents);\r
33     header->setSectionResizeMode(1, QHeaderView::Stretch);\r
34     header->setSectionResizeMode(2, QHeaderView::ResizeToContents);\r
35     header->setSectionResizeMode(3, QHeaderView::ResizeToContents);\r
36     header->setDefaultSectionSize(header->minimumSectionSize());\r
37     // 行の高さを75%に調整\r
38     QHeaderView *vHeader = ui->fileTable->verticalHeader();\r
39     vHeader->setDefaultSectionSize(vHeader->defaultSectionSize() * 0.75);\r
40 }\r
41 \r
42 FolderPanel::~FolderPanel()\r
43 {\r
44     delete ui;\r
45 }\r
46 \r
47 QTableView* FolderPanel::fileTable()\r
48 {\r
49     return ui->fileTable;\r
50 }\r
51 \r
52 const QTableView *FolderPanel::fileTable() const\r
53 {\r
54     return ui->fileTable;\r
55 }\r
56 \r
57 const QString FolderPanel::side() const\r
58 {\r
59     return ui->fileTable->side();\r
60 }\r
61 \r
62 void FolderPanel::setSide(const QString &side)\r
63 {\r
64     ui->fileTable->setSide(side);\r
65 \r
66     QSettings settings;\r
67     FileTableModel *model = new FileTableModel();\r
68     connect(model, SIGNAL(rootChanged(QString)),\r
69             ui->locationField, SLOT(setText(QString)));\r
70     connect(model, SIGNAL(stateChanged(int,int,quint64)),\r
71             this, SLOT(onStateChanged(int,int,quint64)));\r
72     connect(model, SIGNAL(listUpdated()),\r
73             ui->fileTable, SLOT(refresh()));\r
74     connect(model, SIGNAL(filesDropped(QFileInfoList)),\r
75             ui->fileTable, SLOT(acceptDrops(QFileInfoList)));\r
76 \r
77 \r
78     //>>>>> フィルタ初期化\r
79     model->setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);\r
80     if (settings.value(IniKey_ShowHidden, false).toBool()) {\r
81         model->setFilter(model->filter() | QDir::Hidden);\r
82     }\r
83     if (settings.value(IniKey_ShowSystem, false).toBool()) {\r
84         model->setFilter(model->filter() | QDir::System);\r
85     }\r
86     //>>>>> ソート順初期化\r
87     model->setSorting(QDir::Name);  // 0\r
88     int sortBy = settings.value(side + slash + IniKey_SortBy, SortByName).toInt();\r
89     switch (sortBy) {\r
90     case SortByDate:    model->setSorting(model->sorting() | QDir::Time); break;\r
91     case SortBySize:    model->setSorting(model->sorting() | QDir::Size); break;\r
92     case SortByType:    model->setSorting(model->sorting() | QDir::Type); break;\r
93     default:            model->setSorting(model->sorting() | QDir::Name); break;\r
94     }\r
95     // デフォルトだと文字列は昇順で、数値は降順…orz\r
96     int orderBy = settings.value(side + slash + IniKey_OrderBy, OrderByAsc).toInt();\r
97     if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
98         ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
99     {\r
100         model->setSorting(model->sorting() | QDir::Reversed);\r
101     }\r
102     // フォルダの位置\r
103     switch (settings.value(side + slash + IniKey_PutDirs, PutDirsFirst).toInt()) {\r
104     case PutDirsFirst:  model->setSorting(model->sorting() | QDir::DirsFirst); break;\r
105     case PutDirsLast:   model->setSorting(model->sorting() | QDir::DirsLast); break;\r
106     }\r
107     // 大文字小文字の区別\r
108     if (settings.value(side + slash + IniKey_IgnoreCase, true).toBool()) {\r
109         model->setSorting(model->sorting() | QDir::IgnoreCase);\r
110     }\r
111     //>>>>> 監視フォルダ初期化\r
112     QString key = side + slash + IniKey_Dir;\r
113     QString path = settings.value(key, QDir::homePath()).toString();\r
114 \r
115     model->updateAppearance();\r
116     ui->fileTable->setModel(model);\r
117     ui->fileTable->setRootPath(path, true);\r
118 }\r
119 \r
120 void FolderPanel::updateAppearance()\r
121 {\r
122     QSettings settings;\r
123     QPalette palette;\r
124     QFont font;\r
125 \r
126     font = ui->locationField->font();\r
127     font = settings.value(IniKey_BoxFont, font).value<QFont>();\r
128     palette = ui->locationField->palette();\r
129     palette.setColor(\r
130                 QPalette::Base,\r
131                 settings.value(IniKey_BoxColorBg, palette.base()).value<QColor>());\r
132     palette.setColor(\r
133                 QPalette::Text,\r
134                 settings.value(IniKey_BoxColorFg, palette.text()).value<QColor>());\r
135     ui->locationField->setFont(font);\r
136     ui->locationField->setPalette(palette);\r
137 \r
138     palette = ui->fileTable->palette();\r
139     palette.setColor(\r
140                 QPalette::Base,\r
141                 settings.value(IniKey_ViewColorBgNormal, palette.base()).value<QColor>());\r
142     ui->fileTable->setPalette(palette);\r
143 \r
144     FileTableModel *model = static_cast<FileTableModel*>(ui->fileTable->model());\r
145     if (model) {\r
146         model->updateAppearance();\r
147     }\r
148 }\r
149 \r
150 void FolderPanel::onStateChanged(int checkedFolders, int checkedFiles, quint64 totalSize)\r
151 {\r
152     QString msg = "";\r
153     if (checkedFolders > 0) {\r
154         msg += tr("%1個のフォルダ ").arg(checkedFolders);\r
155     }\r
156     if (checkedFiles > 0) {\r
157         msg += tr("%1個のファイル ").arg(checkedFiles);\r
158     }\r
159     if (msg.length() > 0) {\r
160         msg += "を選択 合計 ";\r
161         msg += FilesizeToString(totalSize);\r
162     }\r
163 \r
164     ui->label->setText(msg);\r
165 \r
166 }\r
167 \r
168 void FolderPanel::on_locationField_editingFinished()\r
169 {\r
170     ui->locationField->blockSignals(true);\r
171 \r
172     QString path = ui->locationField->text();\r
173     ui->fileTable->setRootPath(path, true);\r
174 \r
175     ui->locationField->blockSignals(false);\r
176 }\r
177 \r