OSDN Git Service

Ver0.10pre
[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 const QString FolderPanel::side() const\r
48 {\r
49     return ui->fileTable->side();\r
50 }\r
51 \r
52 void FolderPanel::setSide(const QString &side)\r
53 {\r
54     ui->fileTable->setSide(side);\r
55 \r
56     QSettings settings;\r
57     FileTableModel *model = new FileTableModel();\r
58     connect(model, SIGNAL(rootChanged(QString)),\r
59             ui->locationField, SLOT(setText(QString)));\r
60     connect(model, SIGNAL(stateChanged(int,int,quint64)),\r
61             this, SLOT(onStateChanged(int,int,quint64)));\r
62     connect(model, SIGNAL(listUpdated()),\r
63             ui->fileTable, SLOT(refresh()));\r
64     connect(ui->fileTable, SIGNAL(filterChanged()),\r
65             this, SLOT(onFilterChanged()));\r
66 \r
67     //>>>>> フィルタ初期化\r
68     model->setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);\r
69     if (settings.value(IniKey_ShowHidden).toBool()) {\r
70         model->setFilter(model->filter() | QDir::Hidden);\r
71     }\r
72     if (settings.value(IniKey_ShowSystem).toBool()) {\r
73         model->setFilter(model->filter() | QDir::System);\r
74     }\r
75     //>>>>> ソート順初期化\r
76     model->setSorting(QDir::Name);  // 0\r
77     int sortBy = settings.value(side + slash + IniKey_SortBy).toInt();\r
78     switch (sortBy) {\r
79     case SortByDate:    model->setSorting(model->sorting() | QDir::Time); break;\r
80     case SortBySize:    model->setSorting(model->sorting() | QDir::Size); break;\r
81     case SortByType:    model->setSorting(model->sorting() | QDir::Type); break;\r
82     default:            model->setSorting(model->sorting() | QDir::Name); break;\r
83     }\r
84     // デフォルトだと文字列は昇順で、数値は降順…orz\r
85     int orderBy = settings.value(side + slash + IniKey_OrderBy).toInt();\r
86     if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
87         ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
88     {\r
89         model->setSorting(model->sorting() | QDir::Reversed);\r
90     }\r
91     // フォルダの位置\r
92     switch (settings.value(side + slash + IniKey_PutDirs).toInt()) {\r
93     case PutDirsFirst:  model->setSorting(model->sorting() | QDir::DirsFirst); break;\r
94     case PutDirsLast:   model->setSorting(model->sorting() | QDir::DirsLast); break;\r
95     }\r
96     // 大文字小文字の区別\r
97     if (settings.value(side + slash + IniKey_IgnoreCase).toBool()) {\r
98         model->setSorting(model->sorting() | QDir::IgnoreCase);\r
99     }\r
100     //>>>>> 監視フォルダ初期化\r
101     QString path = settings.value(side + slash + IniKey_Dir).toString();\r
102 \r
103     model->updateAppearance();\r
104     ui->fileTable->setModel(model);\r
105     ui->fileTable->setRootPath(path, true);\r
106     onFilterChanged();\r
107 }\r
108 \r
109 void FolderPanel::updateAppearance()\r
110 {\r
111     QSettings settings;\r
112     QPalette palette;\r
113     QFont font;\r
114 \r
115     font = settings.value(IniKey_BoxFont).value<QFont>();\r
116     palette = ui->locationField->palette();\r
117     palette.setColor(QPalette::Base,\r
118                      settings.value(IniKey_BoxColorBg).value<QColor>());\r
119     palette.setColor(QPalette::Text,\r
120                      settings.value(IniKey_BoxColorFg).value<QColor>());\r
121     ui->locationField->setFont(font);\r
122     ui->locationField->setPalette(palette);\r
123 \r
124     palette = ui->fileTable->palette();\r
125     palette.setColor(QPalette::Base,\r
126                      settings.value(IniKey_ViewColorBgNormal).value<QColor>());\r
127     ui->fileTable->setPalette(palette);\r
128 \r
129     FileTableModel *model = static_cast<FileTableModel*>(ui->fileTable->model());\r
130     if (model) {\r
131         model->updateAppearance();\r
132     }\r
133 }\r
134 \r
135 void FolderPanel::onStateChanged(int checkedFolders, int checkedFiles, quint64 totalSize)\r
136 {\r
137     QString msg = "";\r
138     if (checkedFolders > 0) {\r
139         msg += tr("%1個のフォルダ ").arg(checkedFolders);\r
140     }\r
141     if (checkedFiles > 0) {\r
142         msg += tr("%1個のファイル ").arg(checkedFiles);\r
143     }\r
144     if (msg.length() > 0) {\r
145         msg += "を選択 合計 ";\r
146         msg += FilesizeToString(totalSize);\r
147     }\r
148 \r
149     if (msg.isEmpty()) {\r
150         onFilterChanged();\r
151     }\r
152     else {\r
153         ui->label->setText(msg);\r
154     }\r
155 }\r
156 \r
157 void FolderPanel::onFilterChanged()\r
158 {\r
159     FileTableModel *m = static_cast<FileTableModel*>(ui->fileTable->model());\r
160     QString filters = "フィルタ:";\r
161     foreach (const QString &filter, m->nameFilters()) {\r
162         filters += filter + " ";\r
163     }\r
164     ui->label->setText(filters);\r
165 }\r
166 \r
167 void FolderPanel::on_locationField_editingFinished()\r
168 {\r
169     ui->locationField->blockSignals(true);\r
170 \r
171     QString path = ui->locationField->text();\r
172     ui->fileTable->setRootPath(path, true);\r
173 \r
174     ui->locationField->blockSignals(false);\r
175 }\r