OSDN Git Service

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