2 #include "mainwindow.h"
\r
3 #include "preferencedialog.h"
\r
4 #include "filetableview.h"
\r
5 #include "ui_mainwindow.h"
\r
8 #include <QCloseEvent>
\r
10 #include <QDesktopWidget>
\r
11 #include <QMessageBox>
\r
12 #include <QSettings>
\r
13 #include <QNetworkAccessManager>
\r
14 #include <QNetworkReply>
\r
16 MainWindow::MainWindow(QWidget *parent) :
\r
17 QMainWindow(parent),
\r
18 ui(new Ui::MainWindow)
\r
21 ui->RPanel->setSide("Right");
\r
22 ui->LPanel->setSide("Left");
\r
23 ui->LPanel->updateAppearance();
\r
24 ui->RPanel->updateAppearance();
\r
28 if (settings.value(IniKey_ShowHidden).toBool()) {
\r
29 ui->view_Hidden->setChecked(true);
\r
31 if (settings.value(IniKey_ShowSystem).toBool()) {
\r
32 ui->view_System->setChecked(true);
\r
35 enabled = !settings.value(IniKey_EditorPath).toString().isEmpty();
\r
36 ui->action_OpenEditor->setEnabled(enabled);
\r
38 enabled = !settings.value(IniKey_TerminalPath).toString().isEmpty();
\r
39 ui->action_OpenTerminal->setEnabled(enabled);
\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
47 shortcuts = ui->action_Exec->shortcuts();
\r
48 shortcuts.append(QKeySequence("Shift+M"));
\r
49 ui->action_Exec->setShortcuts(shortcuts);
\r
51 shortcuts = ui->view_Filter->shortcuts();
\r
52 shortcuts.append(QKeySequence("Shift+*")); // マヂで!?
\r
53 ui->view_Filter->setShortcuts(shortcuts);
\r
55 shortcuts = ui->action_OpenTerminal->shortcuts();
\r
56 shortcuts.append(QKeySequence("Shift+>")); // マヂで!?
\r
57 ui->action_OpenTerminal->setShortcuts(shortcuts);
\r
59 shortcuts = ui->help_About->shortcuts();
\r
60 shortcuts.append(QKeySequence("Shift+?")); // マヂで!?
\r
61 ui->help_About->setShortcuts(shortcuts);
\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
72 setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));
\r
74 #if defined(Q_OS_MAC) || defined(Q_OS_MAC64) || defined(Q_OS_MACX)
\r
75 setWindowIcon(QIcon(":/images/Gefu.icns"));
\r
77 setWindowIcon(QIcon(":/images/Gefu.png"));
\r
79 //>>>>> ウィンドウサイズと位置を設定する
\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
88 //>>>> INIファイルの設定から復元する
\r
90 strValue = settings.value(IniKey_BootSizeSpec).toString();
\r
91 if (strValue == "sizeAbsolute") {
\r
92 size = settings.value(IniKey_BootSizeAbs).toSize();
\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
99 else if (strValue == "sizeLast") {
\r
100 size = this->geometry().size();
\r
103 strValue = settings.value(IniKey_BootPosSpec).toString();
\r
104 if (strValue == "posAbsolute") {
\r
105 point = settings.value(IniKey_BootPosAbs).toPoint();
\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
112 else if (strValue == "posLast") {
\r
113 point = this->geometry().topLeft();
\r
116 point.setX((QApplication::desktop()->width() - size.width()) / 2);
\r
117 point.setY((QApplication::desktop()->height() - size.height()) / 2);
\r
119 this->setGeometry(QRect(point, size));
\r
122 if (settings.value(IniKey_CheckUpdates).toBool()) {
\r
127 MainWindow::~MainWindow()
\r
132 FileTableView *MainWindow::otherSideView(const FileTableView *view) const
\r
134 QWidget *w = view->parentWidget();
\r
135 if (ui->LPanel == w) {
\r
136 return ui->RPanel->findChild<FileTableView*>("fileTable");
\r
138 else if (ui->RPanel == w) {
\r
139 return ui->LPanel->findChild<FileTableView*>("fileTable");
\r
142 qDebug() << w->objectName();
\r
146 void MainWindow::onActionSetting()
\r
148 PreferenceDialog dlg(this);
\r
150 if (dlg.exec() == QDialog::Accepted) {
\r
151 ui->LPanel->updateAppearance();
\r
152 ui->RPanel->updateAppearance();
\r
154 QSettings settings;
\r
156 enabled = !settings.value(IniKey_EditorPath).toString().isEmpty();
\r
157 ui->action_OpenEditor->setEnabled(enabled);
\r
159 enabled = !settings.value(IniKey_TerminalPath).toString().isEmpty();
\r
160 ui->action_OpenTerminal->setEnabled(enabled);
\r
164 void MainWindow::toggleShowHiddenFiles()
\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
172 ui->view_Hidden->setChecked(show);
\r
174 emit showHiddenFiles(show);
\r
177 void MainWindow::toggleShowSystemFiles()
\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
185 ui->view_System->setChecked(show);
\r
187 emit showSystemFiles(show);
\r
190 void MainWindow::checkUpdate(bool silent)
\r
192 QNetworkAccessManager *manager = new QNetworkAccessManager(this);
\r
195 connect(manager, SIGNAL(finished(QNetworkReply*)),
\r
196 this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));
\r
199 connect(manager, SIGNAL(finished(QNetworkReply*)),
\r
200 this, SLOT(checkUpdateFinished(QNetworkReply*)));
\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
209 void MainWindow::checkUpdateFinished(QNetworkReply *reply)
\r
211 checkUpdateFinished(reply, false);
\r
214 void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)
\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
221 QString version = rx.cap(1);
\r
222 if (version.toInt() > VERSION_VALUE * 100) {
\r
223 QMessageBox::information(
\r
225 tr("最新のバージョンが存在します。<br/>") +
\r
226 tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));
\r
228 else if (!silent) {
\r
229 QMessageBox::information(
\r
231 tr("お使いのバージョンは最新です。"));
\r
235 QMessageBox::critical(
\r
237 tr("最新バージョンのチェックに失敗しました。<br/>") +
\r
238 reply->errorString());
\r
242 void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)
\r
244 checkUpdateFinished(reply, true);
\r
247 void MainWindow::onHelpAbout()
\r
249 QMessageBox::about(
\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
259 MainWindow* getMainWnd()
\r
261 foreach (QWidget *w, qApp->topLevelWidgets()) {
\r
262 if (w->objectName() == "MainWindow") {
\r
263 return static_cast<MainWindow*>(w);
\r
266 qDebug() << "MainWindow not found !?";
\r
271 void MainWindow::closeEvent(QCloseEvent *event)
\r
273 QSettings settings;
\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
283 if (msgBox.exec() == QMessageBox::No) {
\r
287 settings.setValue(IniKey_ConfirmExit, !checkBox->isChecked());
\r
290 settings.setValue(IniKey_WindowGeometry, saveGeometry());
\r
291 settings.setValue(iniKey_WindowState, saveState());
\r
292 QMainWindow::closeEvent(event);
\r