OSDN Git Service

Ver0.08
[gefu/Gefu.git] / mainwindow.cpp
1 #include "common.h"\r
2 #include "mainwindow.h"\r
3 #include "preferencedialog.h"\r
4 #include "filetableview.h"\r
5 #include "ui_mainwindow.h"\r
6 \r
7 #include <QCheckBox>\r
8 #include <QCloseEvent>\r
9 #include <QDebug>\r
10 #include <QDesktopWidget>\r
11 #include <QMessageBox>\r
12 #include <QSettings>\r
13 #include <QNetworkAccessManager>\r
14 #include <QNetworkReply>\r
15 \r
16 MainWindow::MainWindow(QWidget *parent) :\r
17     QMainWindow(parent),\r
18     ui(new Ui::MainWindow)\r
19 {\r
20     ui->setupUi(this);\r
21     ui->RPanel->setSide("Right");\r
22     ui->LPanel->setSide("Left");\r
23     ui->LPanel->updateAppearance();\r
24     ui->RPanel->updateAppearance();\r
25 \r
26     QSettings settings;\r
27     // メニュー項目の状態を初期化する\r
28     if (settings.value(IniKey_ShowHidden).toBool()) {\r
29         ui->view_Hidden->setChecked(true);\r
30     }\r
31     if (settings.value(IniKey_ShowSystem).toBool()) {\r
32         ui->view_System->setChecked(true);\r
33     }\r
34     bool enabled;\r
35     enabled = !settings.value(IniKey_EditorPath).toString().isEmpty();\r
36     ui->action_OpenEditor->setEnabled(enabled);\r
37 \r
38     enabled = !settings.value(IniKey_TerminalPath).toString().isEmpty();\r
39     ui->action_OpenTerminal->setEnabled(enabled);\r
40 \r
41     // 追加のショートカットキーを設定する\r
42     QList<QKeySequence> shortcuts;\r
43     shortcuts = ui->action_Open->shortcuts();\r
44     shortcuts.append(QKeySequence("M"));\r
45     ui->action_Open->setShortcuts(shortcuts);\r
46 \r
47     shortcuts = ui->action_Exec->shortcuts();\r
48     shortcuts.append(QKeySequence("Shift+M"));\r
49     ui->action_Exec->setShortcuts(shortcuts);\r
50 \r
51     shortcuts = ui->view_Filter->shortcuts();\r
52     shortcuts.append(QKeySequence("Shift+*"));  // マヂで!?\r
53     ui->view_Filter->setShortcuts(shortcuts);\r
54 \r
55     shortcuts = ui->action_OpenTerminal->shortcuts();\r
56     shortcuts.append(QKeySequence("Shift+>"));  // マヂで!?\r
57     ui->action_OpenTerminal->setShortcuts(shortcuts);\r
58 \r
59     shortcuts = ui->help_About->shortcuts();\r
60     shortcuts.append(QKeySequence("Shift+?"));  // マヂで!?\r
61     ui->help_About->setShortcuts(shortcuts);\r
62 \r
63     // シグナル/スロットを設定する\r
64     connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(onActionSetting()));\r
65     connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));\r
66     connect(ui->help_About, SIGNAL(triggered()), this, SLOT(onHelpAbout()));\r
67     connect(ui->view_Hidden, SIGNAL(triggered()), this, SLOT(toggleShowHiddenFiles()));\r
68     connect(ui->view_System, SIGNAL(triggered()), this, SLOT(toggleShowSystemFiles()));\r
69     connect(ui->check_Update, SIGNAL(triggered()), this, SLOT(checkUpdate()));\r
70 \r
71     // ウィンドウタイトルを設定する\r
72     setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));\r
73     // ウィンドウアイコンを設定する\r
74 #if defined(Q_OS_MAC) || defined(Q_OS_MAC64) || defined(Q_OS_MACX)\r
75     setWindowIcon(QIcon(":/images/Gefu.icns"));\r
76 #else\r
77     setWindowIcon(QIcon(":/images/Gefu.png"));\r
78 #endif\r
79     //>>>>> ウィンドウサイズと位置を設定する\r
80     QString strValue;\r
81     QPoint point = this->geometry().topLeft();\r
82     QSize size = this->geometry().size();\r
83     //>>>> 前回の位置・サイズ・状態を復元する\r
84     if (!settings.value(IniKey_WindowGeometry, "").toString().isEmpty()) {\r
85         restoreGeometry(settings.value(IniKey_WindowGeometry).toByteArray());\r
86         restoreState(settings.value(iniKey_WindowState).toByteArray());\r
87     }\r
88     //>>>> INIファイルの設定から復元する\r
89     //>>> サイズ\r
90     strValue = settings.value(IniKey_BootSizeSpec).toString();\r
91     if (strValue == "sizeAbsolute") {\r
92         size = settings.value(IniKey_BootSizeAbs).toSize();\r
93     }\r
94     else if (strValue == "sizeRelative") {\r
95         size = settings.value(IniKey_BootSizeRel).toSize();\r
96         size.setWidth(size.width() * QApplication::desktop()->width() / 100.0);\r
97         size.setHeight(size.height() * QApplication::desktop()->height() / 100.0);\r
98     }\r
99     else if (strValue == "sizeLast") {\r
100         size = this->geometry().size();\r
101     }\r
102     //>>> 位置\r
103     strValue = settings.value(IniKey_BootPosSpec).toString();\r
104     if (strValue == "posAbsolute") {\r
105         point = settings.value(IniKey_BootPosAbs).toPoint();\r
106     }\r
107     else if (strValue == "posRelative") {\r
108         point = settings.value(IniKey_BootPosRel).toPoint();\r
109         point.setX(point.x() * QApplication::desktop()->width() / 100.0);\r
110         point.setY(point.y() * QApplication::desktop()->height() / 100.0);\r
111     }\r
112     else if (strValue == "posLast") {\r
113         point = this->geometry().topLeft();\r
114     }\r
115     else {\r
116         point.setX((QApplication::desktop()->width() - size.width()) / 2);\r
117         point.setY((QApplication::desktop()->height() - size.height()) / 2);\r
118     }\r
119     this->setGeometry(QRect(point, size));\r
120 \r
121     // 最新バージョンをチェックする\r
122     if (settings.value(IniKey_CheckUpdates).toBool()) {\r
123         checkUpdate(true);\r
124     }\r
125 }\r
126 \r
127 MainWindow::~MainWindow()\r
128 {\r
129     delete ui;\r
130 }\r
131 \r
132 FileTableView *MainWindow::otherSideView(const FileTableView *view) const\r
133 {\r
134     QWidget *w = view->parentWidget();\r
135     if (ui->LPanel == w) {\r
136         return ui->RPanel->findChild<FileTableView*>("fileTable");\r
137     }\r
138     else if (ui->RPanel == w) {\r
139         return ui->LPanel->findChild<FileTableView*>("fileTable");\r
140     }\r
141 \r
142     qDebug() << w->objectName();\r
143     return NULL;\r
144 }\r
145 \r
146 void MainWindow::onActionSetting()\r
147 {\r
148     PreferenceDialog dlg(this);\r
149 \r
150     if (dlg.exec() == QDialog::Accepted) {\r
151         ui->LPanel->updateAppearance();\r
152         ui->RPanel->updateAppearance();\r
153 \r
154         QSettings settings;\r
155         bool enabled;\r
156         enabled = !settings.value(IniKey_EditorPath).toString().isEmpty();\r
157         ui->action_OpenEditor->setEnabled(enabled);\r
158 \r
159         enabled = !settings.value(IniKey_TerminalPath).toString().isEmpty();\r
160         ui->action_OpenTerminal->setEnabled(enabled);\r
161     }\r
162 }\r
163 \r
164 void MainWindow::toggleShowHiddenFiles()\r
165 {\r
166     // キーボードがトリガーの場合、メニュー項目のチェック状態は\r
167     // 変わらない(Mac)ので、QSettingsを使う\r
168     QSettings settings;\r
169     bool show = !settings.value(IniKey_ShowHidden).toBool();\r
170     settings.setValue(IniKey_ShowHidden, show);\r
171 \r
172     ui->view_Hidden->setChecked(show);\r
173 \r
174     emit showHiddenFiles(show);\r
175 }\r
176 \r
177 void MainWindow::toggleShowSystemFiles()\r
178 {\r
179     // キーボードがトリガーの場合、メニュー項目のチェック状態は\r
180     // 変わらない(Mac)ので、QSettingsを使う\r
181     QSettings settings;\r
182     bool show = !settings.value(IniKey_ShowSystem).toBool();\r
183     settings.setValue(IniKey_ShowSystem, show);\r
184 \r
185     ui->view_System->setChecked(show);\r
186 \r
187     emit showSystemFiles(show);\r
188 }\r
189 \r
190 void MainWindow::checkUpdate(bool silent)\r
191 {\r
192     QNetworkAccessManager *manager = new QNetworkAccessManager(this);\r
193 \r
194     if (silent) {\r
195         connect(manager, SIGNAL(finished(QNetworkReply*)),\r
196                 this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));\r
197     }\r
198     else {\r
199         connect(manager, SIGNAL(finished(QNetworkReply*)),\r
200                 this, SLOT(checkUpdateFinished(QNetworkReply*)));\r
201     }\r
202 #ifdef Q_OS_WIN\r
203     manager->get(QNetworkRequest(QUrl("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_win.html")));\r
204 #elif defined(Q_OS_MAC)\r
205     manager->get(QNetworkRequest(QUrl("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_mac.html")));\r
206 #endif\r
207 }\r
208 \r
209 void MainWindow::checkUpdateFinished(QNetworkReply *reply)\r
210 {\r
211     checkUpdateFinished(reply, false);\r
212 }\r
213 \r
214 void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)\r
215 {\r
216     if (reply->error() == QNetworkReply::NoError) {\r
217         QString str = reply->readAll();\r
218         str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);\r
219         QRegExp rx("Gefu([0-9]+)");\r
220         rx.indexIn(str);\r
221         QString version = rx.cap(1);\r
222         if (version.toInt() > VERSION_VALUE * 100) {\r
223             QMessageBox::information(\r
224                         this, tr("情報"),\r
225                         tr("最新のバージョンが存在します。<br/>") +\r
226                         tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));\r
227         }\r
228         else if (!silent) {\r
229             QMessageBox::information(\r
230                         this, tr("情報"),\r
231                         tr("お使いのバージョンは最新です。"));\r
232         }\r
233     }\r
234     else if (!silent){\r
235         QMessageBox::critical(\r
236                     this, tr("エラー"),\r
237                     tr("最新バージョンのチェックに失敗しました。<br/>") +\r
238                     reply->errorString());\r
239     }\r
240 }\r
241 \r
242 void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)\r
243 {\r
244     checkUpdateFinished(reply, true);\r
245 }\r
246 \r
247 void MainWindow::onHelpAbout()\r
248 {\r
249     QMessageBox::about(\r
250                 this,\r
251                 tr("げふぅ について"),\r
252                 tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +\r
253                 tr("<center>Gefu is an Experimental File Utility.<br/>"\r
254                    "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"\r
255                    "<p>最新版の情報は<a href='http://miyabi.rakusaba.jp'>喫茶[雅]</a>で公開しています。</p>"\r
256                    "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));\r
257 }\r
258 \r
259 MainWindow* getMainWnd()\r
260 {\r
261     foreach (QWidget *w, qApp->topLevelWidgets()) {\r
262         if (w->objectName() == "MainWindow") {\r
263             return static_cast<MainWindow*>(w);\r
264         }\r
265     }\r
266     qDebug() << "MainWindow not found !?";\r
267     return NULL;\r
268 }\r
269 \r
270 \r
271 void MainWindow::closeEvent(QCloseEvent *event)\r
272 {\r
273     QSettings settings;\r
274 \r
275     if (settings.value(IniKey_ConfirmExit).toBool()) {\r
276         QMessageBox msgBox;\r
277         QCheckBox *checkBox = new QCheckBox();\r
278         checkBox->setText(tr("次回以降は確認しない"));\r
279         msgBox.setCheckBox(checkBox);\r
280         msgBox.setText(tr("終了しますか?"));\r
281         msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);\r
282 \r
283         if (msgBox.exec() == QMessageBox::No) {\r
284             event->ignore();\r
285             return;\r
286         }\r
287         settings.setValue(IniKey_ConfirmExit, !checkBox->isChecked());\r
288     }\r
289 \r
290     settings.setValue(IniKey_WindowGeometry, saveGeometry());\r
291     settings.setValue(iniKey_WindowState, saveState());\r
292     QMainWindow::closeEvent(event);\r
293 }\r