OSDN Git Service

Ver0.08pre
authorMasayuki Satoh <miyabi.satoh@gmail.com>
Sat, 23 Aug 2014 02:21:20 +0000 (11:21 +0900)
committerMasayuki Satoh <miyabi.satoh@gmail.com>
Sat, 23 Aug 2014 02:21:20 +0000 (11:21 +0900)
15 files changed:
Gefu.pro
README.md
common.h
filetablemodel.h
filetableview.cpp
filetableview.h
folderpanel.cpp
folderpanel.h
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
preferencedialog.cpp
preferencedialog.h
preferencedialog.ui

index d4149be..9d6b7fa 100644 (file)
--- a/Gefu.pro
+++ b/Gefu.pro
@@ -5,15 +5,17 @@
 #-------------------------------------------------
 
 QT       += core gui
+QT       += network
 
 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
+
 TARGET = Gefu
 TEMPLATE = app
 
 
 SOURCES += main.cpp\
-        mainwindow.cpp \
+    mainwindow.cpp \
     folderpanel.cpp \
     renamesingledialog.cpp \
     renamemultidialog.cpp \
index 1e1ebca..ed53f0c 100644 (file)
--- a/README.md
+++ b/README.md
@@ -4,7 +4,6 @@ Gefu
 Gefu is an Experimental File Utility.
 
 ### TODO
-- 現在のフォルダを端末で開く
 - コンテキストメニュー
 - オプション
     - ファンクションキー
@@ -13,10 +12,17 @@ Gefu is an Experimental File Utility.
 - 簡易テキストビューア
 - 簡易画像ビューア
 - 簡易アーカイバ
-- 最新版チェック、ダウンロード
 - SNS連携(タイムライン表示とか) ← ファイラーの機能か?
 
-#### 2014/08/23 Ver0.07
+#### 2014/08/23 Ver0.08
+- 「ターミナルで開く」を実装。
+- Shift+ダブルクリックで、ファイルを外部エディタで開くようにした。
+- Ctrl+ダブルクリックで、フォルダをターミナルで開くようにした。
+- 「色とフォント」にインポート・エクスポート機能を追加。
+- マスク表示(フィルタ)機能を追加。
+- 最新バージョンのチェック機能を追加。
+
+#### 2014/08/23 Ver0.07 公開
 - ダブルクリック時、ファイルは標準の関連付けで実行するようにした。
 - 設定項目追加。
 - 「外部エディタで開く」を実装。
index f85b885..5447ebf 100644 (file)
--- a/common.h
+++ b/common.h
@@ -8,7 +8,7 @@ class MainWindow;
 extern MainWindow* getMainWnd();\r
 extern QString FilesizeToString(quint64 size);\r
 \r
-#define VERSION_VALUE   0.07\r
+#define VERSION_VALUE   0.08\r
 \r
 #define slash   QString("/")\r
 #define QQ(x)   ("\"" + QString(x) + "\"")\r
@@ -18,6 +18,7 @@ extern QString FilesizeToString(quint64 size);
 #define IniKey_DefaultOnCopy            "Common/DefaultCopyMode"\r
 #define IniKey_MoveAfterCreateFolder    "Common/MoveAfterFolderCreation"\r
 #define IniKey_OpenAfterCreateFile      "Common/OpenAfterFileCreation"\r
+#define IniKey_CheckUpdates             "Common/CheckUpdates"\r
 #define IniKey_BootSizeSpec             "BootAndExit/SizeSpec"\r
 #define IniKey_BootSizeRel              "BootAndExit/SizeRel"\r
 #define IniKey_BootSizeAbs              "BootAndExit/SizeAbs"\r
@@ -48,7 +49,7 @@ extern QString FilesizeToString(quint64 size);
 #define IniKey_EditorPath               "Editor/Path"\r
 #define IniKey_EditorOption             "Editor/Option"\r
 #define IniKey_TerminalPath             "Terminal/Path"\r
-#define IniKey_TerminalOption           "TerminalOption"\r
+#define IniKey_TerminalOption           "Terminal/Option"\r
 #define IniKey_WindowGeometry           "Window/Geometry"\r
 #define iniKey_WindowState              "Window/State"\r
 // 以下は[Left/Right]セクションのキー\r
index 99757ee..d90d587 100644 (file)
@@ -19,6 +19,11 @@ public:
     QDir::Filters filter() const { return m_dir.filter(); }\r
     void setFilter(QDir::Filters filters) { m_dir.setFilter(filters); }\r
 \r
+    QStringList nameFilters() const { return m_dir.nameFilters(); }\r
+    void setNameFilters(const QStringList &nameFiltes) {\r
+        m_dir.setNameFilters(nameFiltes);\r
+    }\r
+\r
     QDir::SortFlags sorting() const { return m_dir.sorting(); }\r
     void setSorting(QDir::SortFlags sort) { m_dir.setSorting(sort); }\r
 \r
index 1a1fa1a..3fcdebe 100644 (file)
@@ -47,6 +47,7 @@ FileTableView::FileTableView(QWidget *parent) :
     connect(MENU_TRRIGGERED(action_Open), this, SLOT(setPath()));\r
     connect(MENU_TRRIGGERED(action_Exec), this, SLOT(openUrl()));\r
     connect(MENU_TRRIGGERED(action_OpenEditor), this, SLOT(openEditor()));\r
+    connect(MENU_TRRIGGERED(action_OpenTerminal), this, SLOT(openTerminal()));\r
     connect(MENU_TRRIGGERED(action_Command), this, SLOT(kickProcess()));\r
 \r
     connect(MENU_TRRIGGERED(mark_Toggle), this, SLOT(toggleChecked()));\r
@@ -60,6 +61,7 @@ FileTableView::FileTableView(QWidget *parent) :
     connect(MENU_TRRIGGERED(view_Swap), this, SLOT(swapPath()));\r
     connect(MENU_TRRIGGERED(view_Sort), this, SLOT(setSort()));\r
     connect(MENU_TRRIGGERED(view_Refresh), this, SLOT(refresh()));\r
+    connect(MENU_TRRIGGERED(view_Filter), this, SLOT(setFilter()));\r
 \r
     connect(MENU_TRRIGGERED(move_Back), this, SLOT(back()));\r
     connect(MENU_TRRIGGERED(move_Forward), this, SLOT(forward()));\r
@@ -213,6 +215,7 @@ void FileTableView::openEditor(const QString &path)
     else {\r
         info.setFile(path);\r
     }\r
+\r
     QString exe = settings.value(IniKey_EditorPath).toString();\r
     QString opt = settings.value(IniKey_EditorOption).toString();\r
     opt.replace("$B", info.completeBaseName());\r
@@ -223,7 +226,7 @@ void FileTableView::openEditor(const QString &path)
 \r
     QString command;\r
 #ifdef Q_OS_MAC\r
-    command = "open " + exe + " " + opt;\r
+    command = "open -a " + exe + " " + opt;\r
 #else\r
     command = QQ(exe) + " " + opt;\r
 #endif\r
@@ -238,6 +241,57 @@ void FileTableView::openEditor(const QString &path)
     }\r
 }\r
 \r
+void FileTableView::openTerminal(const QString &path)\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    QSettings settings;\r
+    if (settings.value(IniKey_TerminalPath).toString().isEmpty()) {\r
+        QMessageBox::critical(\r
+                    this, tr("エラー"),\r
+                    tr("ターミナルのパスが未定義です。"));\r
+        return;\r
+    }\r
+\r
+    QFileInfo info;\r
+    if (path.isEmpty()) {\r
+        FileTableModel *m = static_cast<FileTableModel*>(model());\r
+        info.setFile(m->absoluteFilePath(currentIndex()));\r
+    }\r
+    else {\r
+        info.setFile(path);\r
+    }\r
+\r
+    QString exe = settings.value(IniKey_TerminalPath).toString();\r
+    QString opt = settings.value(IniKey_TerminalOption).toString();\r
+    opt.replace("$B", info.completeBaseName());\r
+    opt.replace("$E", info.suffix());\r
+    opt.replace("$F", info.fileName());\r
+    if (info.isDir()) {\r
+        opt.replace("$D", info.absoluteFilePath());\r
+    }\r
+    else {\r
+        opt.replace("$D", info.absolutePath());\r
+    }\r
+    opt.replace("$P", info.absoluteFilePath());\r
+\r
+    QString command;\r
+#ifdef Q_OS_MAC\r
+    command = "open -a " + exe + " --args " + opt;\r
+#else\r
+    command = QQ(exe) + " " + opt;\r
+#endif\r
+    qDebug() << command;\r
+    QProcess process(this);\r
+    process.setWorkingDirectory(info.absolutePath());\r
+    if (!process.startDetached(command)) {\r
+        QMessageBox::critical(\r
+                    this, tr("エラー"),\r
+                    tr("ターミナルの起動に失敗しました。<br/>")\r
+                    + command);\r
+    }\r
+}\r
+\r
 void FileTableView::kickProcess()\r
 {\r
     CHECK_FOCUS;\r
@@ -498,6 +552,34 @@ void FileTableView::refresh()
     selectRow(row);\r
 }\r
 \r
+void FileTableView::setFilter()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    QString filters = QString::null;\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+    foreach (const QString &filter, m->nameFilters()) {\r
+        filters += filter + " ";\r
+    }\r
+\r
+    QInputDialog dlg(this);\r
+    dlg.setInputMode(QInputDialog::TextInput);\r
+    dlg.setWindowTitle(tr("フィルタを設定"));\r
+    dlg.setLabelText(tr("フィルタ:"));\r
+    dlg.setTextValue(filters);\r
+    dlg.resize(getMainWnd()->width() * 0.8, dlg.height());\r
+\r
+    if (dlg.exec() == QDialog::Accepted) {\r
+        filters = dlg.textValue();\r
+        if (filters.isEmpty()) {\r
+            filters = "*";\r
+        }\r
+        m->setNameFilters(filters.split(" ", QString::SkipEmptyParts));\r
+        refresh();\r
+        emit filterChanged();\r
+    }\r
+}\r
+\r
 void FileTableView::back()\r
 {\r
     CHECK_FOCUS;\r
@@ -888,7 +970,15 @@ void FileTableView::onDoubleClick(const QModelIndex &index)
     FileTableModel *m = static_cast<FileTableModel*>(model());\r
 \r
     if (m->isDir(index)) {\r
-        setRootPath(m->absoluteFilePath(index), true);\r
+        if (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier)) {\r
+            openTerminal(m->absoluteFilePath(index));\r
+        }\r
+        else {\r
+            setRootPath(m->absoluteFilePath(index), true);\r
+        }\r
+    }\r
+    else if (QApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)){\r
+        openEditor(m->absoluteFilePath(index));\r
     }\r
     else {\r
         openUrl(index);\r
index c173704..513db97 100644 (file)
@@ -31,11 +31,13 @@ private:
 \r
 signals:\r
     void indexChanged(const QString &text);\r
+    void filterChanged();\r
 \r
 private slots:\r
     void setPath();\r
     void openUrl(const QModelIndex &index = QModelIndex());\r
     void openEditor(const QString &path = QString());\r
+    void openTerminal(const QString &path = QString());\r
     void kickProcess();\r
 \r
     void toggleChecked();\r
@@ -51,6 +53,7 @@ private slots:
     void showSystemFiles(bool show);\r
     void setSort();\r
     void refresh();\r
+    void setFilter();\r
 \r
     void back();\r
     void forward();\r
index 85db85b..7a576f1 100644 (file)
@@ -61,6 +61,8 @@ void FolderPanel::setSide(const QString &side)
             this, SLOT(onStateChanged(int,int,quint64)));\r
     connect(model, SIGNAL(listUpdated()),\r
             ui->fileTable, SLOT(refresh()));\r
+    connect(ui->fileTable, SIGNAL(filterChanged()),\r
+            this, SLOT(onFilterChanged()));\r
 \r
     //>>>>> フィルタ初期化\r
     model->setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);\r
@@ -101,6 +103,7 @@ void FolderPanel::setSide(const QString &side)
     model->updateAppearance();\r
     ui->fileTable->setModel(model);\r
     ui->fileTable->setRootPath(path, true);\r
+    onFilterChanged();\r
 }\r
 \r
 void FolderPanel::updateAppearance()\r
@@ -143,8 +146,22 @@ void FolderPanel::onStateChanged(int checkedFolders, int checkedFiles, quint64 t
         msg += FilesizeToString(totalSize);\r
     }\r
 \r
-    ui->label->setText(msg);\r
+    if (msg.isEmpty()) {\r
+        onFilterChanged();\r
+    }\r
+    else {\r
+        ui->label->setText(msg);\r
+    }\r
+}\r
 \r
+void FolderPanel::onFilterChanged()\r
+{\r
+    FileTableModel *m = static_cast<FileTableModel*>(ui->fileTable->model());\r
+    QString filters = "フィルタ:";\r
+    foreach (const QString &filter, m->nameFilters()) {\r
+        filters += filter + " ";\r
+    }\r
+    ui->label->setText(filters);\r
 }\r
 \r
 void FolderPanel::on_locationField_editingFinished()\r
index 98bebca..2193e5f 100644 (file)
@@ -25,6 +25,7 @@ private:
 \r
 private slots:\r
     void onStateChanged(int checkedFolders, int checkedFiles, quint64 totalSize);\r
+    void onFilterChanged();\r
     void on_locationField_editingFinished();\r
 };\r
 \r
index 9357b5a..4007631 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -22,6 +22,13 @@ int main(int argc, char *argv[])
         settings.clear();\r
     }\r
 \r
+    // オラはやっちまっただぁ…\r
+    QString strValue = settings.value("TerminalOption", "").toString();\r
+    if (!strValue.isEmpty()) {\r
+        settings.remove("TerminalOption");\r
+        settings.setValue(IniKey_TerminalOption, strValue);\r
+    }\r
+\r
     // 各オプションのデフォルト値を設定する\r
     //>>>>> 起動と終了\r
     if (settings.value(IniKey_ConfirmExit, "").toString().isEmpty())\r
@@ -52,7 +59,7 @@ int main(int argc, char *argv[])
         settings.setValue(IniKey_ViewColorFgReadonly, QColor(0,128,0));\r
         settings.setValue(IniKey_ViewColorFgSystem, QColor(128,0,128));\r
     }\r
-    //>>>>>\r
+    //>>>>> ファイル操作\r
     if (settings.value(IniKey_AutoCloseCopy, "").toString().isEmpty()) {\r
         settings.setValue(IniKey_AutoCloseCopy, false);\r
         settings.setValue(IniKey_AutoCloseDelete, false);\r
@@ -71,12 +78,12 @@ int main(int argc, char *argv[])
         settings.setValue(IniKey_MoveAfterCreateFolder, false);\r
     if (settings.value(IniKey_OpenAfterCreateFile, "").toString().isEmpty())\r
         settings.setValue(IniKey_OpenAfterCreateFile, false);\r
-    //>>>>>\r
+    //>>>>> パス設定\r
     if (settings.value(IniKey_EditorPath, "").toString().isEmpty()) {\r
 #if defined(Q_OS_WIN)\r
         settings.setValue(IniKey_EditorPath, "notepad.exe");\r
 #elif defined(Q_OS_MAC)\r
-        settings.setValue(IniKey_EditorPath, "-t");\r
+        settings.setValue(IniKey_EditorPath, "/Applications/TextEdit.app");\r
 #else\r
         settings.setValue(IniKey_EditorPath, "gedit");\r
 #endif\r
@@ -100,6 +107,9 @@ int main(int argc, char *argv[])
     //>>>>> システムファイルの表示\r
     if (settings.value(IniKey_ShowSystem, "").toString().isEmpty())\r
         settings.setValue(IniKey_ShowSystem, false);\r
+    //>>>>> 最新版のチェック\r
+    if (settings.value(IniKey_CheckUpdates, "").toString().isEmpty())\r
+        settings.setValue(IniKey_CheckUpdates, true);\r
     //>>>>> 最後のフォルダとソート方法\r
     QString side = "Left/";\r
     if (settings.value(side + IniKey_Dir, "").toString().isEmpty()) {\r
index 741a032..85caca0 100644 (file)
@@ -10,6 +10,8 @@
 #include <QDesktopWidget>\r
 #include <QMessageBox>\r
 #include <QSettings>\r
+#include <QNetworkAccessManager>\r
+#include <QNetworkReply>\r
 \r
 MainWindow::MainWindow(QWidget *parent) :\r
     QMainWindow(parent),\r
@@ -33,7 +35,7 @@ MainWindow::MainWindow(QWidget *parent) :
     enabled = !settings.value(IniKey_EditorPath).toString().isEmpty();\r
     ui->action_OpenEditor->setEnabled(enabled);\r
 \r
-    enabled = settings.value(IniKey_TerminalPath).toString().isEmpty();\r
+    enabled = !settings.value(IniKey_TerminalPath).toString().isEmpty();\r
     ui->action_OpenTerminal->setEnabled(enabled);\r
 \r
     // 追加のショートカットキーを設定する\r
@@ -46,6 +48,14 @@ MainWindow::MainWindow(QWidget *parent) :
     shortcuts.append(QKeySequence("Shift+M"));\r
     ui->action_Exec->setShortcuts(shortcuts);\r
 \r
+    shortcuts = ui->view_Filter->shortcuts();\r
+    shortcuts.append(QKeySequence("Shift+*"));  // マヂで!?\r
+    ui->view_Filter->setShortcuts(shortcuts);\r
+\r
+    shortcuts = ui->action_OpenTerminal->shortcuts();\r
+    shortcuts.append(QKeySequence("Shift+>"));  // マヂで!?\r
+    ui->action_OpenTerminal->setShortcuts(shortcuts);\r
+\r
     shortcuts = ui->help_About->shortcuts();\r
     shortcuts.append(QKeySequence("Shift+?"));  // マヂで!?\r
     ui->help_About->setShortcuts(shortcuts);\r
@@ -56,6 +66,7 @@ MainWindow::MainWindow(QWidget *parent) :
     connect(ui->help_About, SIGNAL(triggered()), this, SLOT(onHelpAbout()));\r
     connect(ui->view_Hidden, SIGNAL(triggered()), this, SLOT(toggleShowHiddenFiles()));\r
     connect(ui->view_System, SIGNAL(triggered()), this, SLOT(toggleShowSystemFiles()));\r
+    connect(ui->check_Update, SIGNAL(triggered()), this, SLOT(checkUpdate()));\r
 \r
     // ウィンドウタイトルを設定する\r
     setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));\r
@@ -106,6 +117,11 @@ MainWindow::MainWindow(QWidget *parent) :
         point.setY((QApplication::desktop()->height() - size.height()) / 2);\r
     }\r
     this->setGeometry(QRect(point, size));\r
+\r
+    // 最新バージョンをチェックする\r
+    if (settings.value(IniKey_CheckUpdates).toBool()) {\r
+        checkUpdate(true);\r
+    }\r
 }\r
 \r
 MainWindow::~MainWindow()\r
@@ -171,6 +187,63 @@ void MainWindow::toggleShowSystemFiles()
     emit showSystemFiles(show);\r
 }\r
 \r
+void MainWindow::checkUpdate(bool silent)\r
+{\r
+    QNetworkAccessManager *manager = new QNetworkAccessManager(this);\r
+\r
+    if (silent) {\r
+        connect(manager, SIGNAL(finished(QNetworkReply*)),\r
+                this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));\r
+    }\r
+    else {\r
+        connect(manager, SIGNAL(finished(QNetworkReply*)),\r
+                this, SLOT(checkUpdateFinished(QNetworkReply*)));\r
+    }\r
+#ifdef Q_OS_WIN\r
+    manager->get(QNetworkRequest(QUrl("https://dl.dropboxusercontent.com/u/3112525/gefu_latest_win.txt")));\r
+#elif defined(Q_OS_MAC)\r
+    manager->get(QNetworkRequest(QUrl("https://dl.dropboxusercontent.com/u/3112525/gefu_latest_mac.txt")));\r
+#endif\r
+}\r
+\r
+void MainWindow::checkUpdateFinished(QNetworkReply *reply)\r
+{\r
+    checkUpdateFinished(reply, false);\r
+}\r
+\r
+void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)\r
+{\r
+    if (reply->error() == QNetworkReply::NoError) {\r
+        QString str = reply->readAll();\r
+        str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);\r
+        QRegExp rx("Gefu([0-9]+)");\r
+        rx.indexIn(str);\r
+        QString version = rx.cap(1);\r
+        if (version.toInt() > VERSION_VALUE * 100) {\r
+            QMessageBox::information(\r
+                        this, tr("情報"),\r
+                        tr("最新のバージョンが存在します。<br/>") +\r
+                        tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));\r
+        }\r
+        else if (!silent) {\r
+            QMessageBox::information(\r
+                        this, tr("情報"),\r
+                        tr("お使いのバージョンは最新です。"));\r
+        }\r
+    }\r
+    else if (!silent){\r
+        QMessageBox::critical(\r
+                    this, tr("エラー"),\r
+                    tr("最新バージョンのチェックに失敗しました。<br/>") +\r
+                    reply->errorString());\r
+    }\r
+}\r
+\r
+void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)\r
+{\r
+    checkUpdateFinished(reply, true);\r
+}\r
+\r
 void MainWindow::onHelpAbout()\r
 {\r
     QMessageBox::about(\r
index 10fb6c4..4cb6eec 100644 (file)
@@ -5,6 +5,7 @@
 #include <QMainWindow>\r
 class FolderPanel;\r
 class FileTableView;\r
+class QNetworkReply;\r
 \r
 namespace Ui {\r
 class MainWindow;\r
@@ -31,6 +32,10 @@ public slots:
 private slots:\r
     void toggleShowHiddenFiles();\r
     void toggleShowSystemFiles();\r
+    void checkUpdate(bool silent = false);\r
+    void checkUpdateFinished(QNetworkReply *reply);\r
+    void checkUpdateFinished(QNetworkReply *reply, bool silent);\r
+    void checkUpdateFinishedSilent(QNetworkReply *reply);\r
 \r
 private:\r
     Ui::MainWindow *ui;\r
index ba7020a..6b25603 100644 (file)
    <addaction name="mark_AllOff"/>\r
    <addaction name="separator"/>\r
    <addaction name="view_Refresh"/>\r
+   <addaction name="view_Filter"/>\r
    <addaction name="separator"/>\r
    <addaction name="move_Back"/>\r
    <addaction name="move_Forward"/>\r
     <addaction name="view_System"/>\r
     <addaction name="separator"/>\r
     <addaction name="view_Sort"/>\r
+    <addaction name="view_Filter"/>\r
    </widget>\r
    <widget class="QMenu" name="menu_Move">\r
     <property name="title">\r
     <property name="title">\r
      <string>ヘルプ(&amp;H)</string>\r
     </property>\r
+    <addaction name="check_Update"/>\r
     <addaction name="help_About"/>\r
    </widget>\r
    <addaction name="menu_File"/>\r
     <string>&gt;</string>\r
    </property>\r
   </action>\r
+  <action name="view_Filter">\r
+   <property name="icon">\r
+    <iconset resource="resource.qrc">\r
+     <normaloff>:/images/Funnel.png</normaloff>:/images/Funnel.png</iconset>\r
+   </property>\r
+   <property name="text">\r
+    <string>フィルタを設定...</string>\r
+   </property>\r
+   <property name="toolTip">\r
+    <string>フィルタを設定...</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>*</string>\r
+   </property>\r
+  </action>\r
+  <action name="check_Update">\r
+   <property name="text">\r
+    <string>最新バージョンをチェック</string>\r
+   </property>\r
+   <property name="toolTip">\r
+    <string>最新バージョンをチェック</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>V</string>\r
+   </property>\r
+  </action>\r
  </widget>\r
  <layoutdefault spacing="6" margin="11"/>\r
  <customwidgets>\r
index 3ac0073..e6307d4 100644 (file)
@@ -9,6 +9,7 @@
 #include <QDebug>
 #include <QDir>
 #include <QFileDialog>
+#include <QStandardPaths>
 
 PreferenceDialog::PreferenceDialog(QWidget *parent) :
     QDialog(parent),
@@ -51,6 +52,8 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
     connect(ui->viewFontBold, SIGNAL(clicked()), this, SLOT(changeFont()));
     connect(ui->viewFontSize, SIGNAL(valueChanged(int)), this, SLOT(changeFont()));
 
+    connect(ui->importAppearance, SIGNAL(clicked()), this, SLOT(importAppearance()));
+    connect(ui->exportAppearance, SIGNAL(clicked()), this, SLOT(exportAppearance()));
     connect(ui->termBrowse, SIGNAL(clicked()), this, SLOT(browseApp()));
     connect(ui->editorBrowse, SIGNAL(clicked()), this, SLOT(browseApp()));
 
@@ -58,9 +61,6 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
     QString strValue;
     QSize size;
     QPoint point;
-    QColor color;
-    QPalette palette;
-    QFont font;
     QRadioButton *radioBtn;
 
     //>>>>> 起動と終了
@@ -108,6 +108,70 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
     ui->resetOnBoot->setChecked(settings.value(IniKey_ResetOnBoot).toBool());
 
     //>>>>> 色とフォント
+    loadAppearance(settings);
+
+    //>>>>> ファイル操作
+    // 確認ダイアログの表示
+    ui->confirmCopy->setChecked(settings.value(IniKey_ConfirmCopy).toBool());
+    ui->confirmDelete->setChecked(settings.value(IniKey_ConfirmDelete).toBool());
+    ui->confirmMove->setChecked(settings.value(IniKey_ConfirmMove).toBool());
+    ui->confirmRename->setChecked(settings.value(IniKey_ConfirmRename).toBool());
+    // 完了ダイアログの自動クローズ
+    ui->autoCloseCopy->setChecked(settings.value(IniKey_AutoCloseCopy).toBool());
+    ui->autoCloseDelete->setChecked(settings.value(IniKey_AutoCloseDelete).toBool());
+    ui->autoCloseMove->setChecked(settings.value(IniKey_AutoCloseMove).toBool());
+    ui->autoCloseRename->setChecked(settings.value(IniKey_AutoCloseRename).toBool());
+    // 上書き時の既定動作
+    strValue = settings.value(IniKey_DefaultOnCopy).toString();
+    if (strValue.isEmpty()) {
+        strValue = "owDefIfNew";
+    }
+    radioBtn = findChild<QRadioButton*>(strValue);
+    if (radioBtn == NULL) {
+        radioBtn = ui->owDefIfNew;
+    }
+    radioBtn->setChecked(true);
+    ui->moveAfterCreate->setChecked(settings.value(IniKey_MoveAfterCreateFolder).toBool());
+    ui->openAfterCreate->setChecked(settings.value(IniKey_OpenAfterCreateFile).toBool());
+
+    //>>>>> パス設定
+    // エディタ
+    ui->editorOpt->setText(settings.value(IniKey_EditorOption).toString());
+    ui->editorPath->setText(settings.value(IniKey_EditorPath).toString());
+    // ターミナル
+    ui->termOpt->setText(settings.value(IniKey_TerminalOption).toString());
+    ui->termPath->setText(settings.value(IniKey_TerminalPath).toString());
+}
+
+PreferenceDialog::~PreferenceDialog()
+{
+    delete ui;
+}
+
+void PreferenceDialog::saveAppearance(QSettings &settings)
+{
+    QFont font = ui->sampleEdit->font();
+    QPalette palette = ui->sampleEdit->palette();
+    settings.setValue(IniKey_BoxColorBg, palette.base().color());
+    settings.setValue(IniKey_BoxColorFg, palette.text().color());
+    settings.setValue(IniKey_BoxFont, font);
+
+    settings.setValue(IniKey_ViewColorBgMark, m_colorMap["clrBgMark"]);
+    settings.setValue(IniKey_ViewColorBgNormal, m_colorMap["clrBgNormal"]);
+    settings.setValue(IniKey_ViewColorFgHidden, m_colorMap["clrFgHidden"]);
+    settings.setValue(IniKey_ViewColorFgMark, m_colorMap["clrFgMark"]);
+    settings.setValue(IniKey_ViewColorFgNormal, m_colorMap["clrFgNormal"]);
+    settings.setValue(IniKey_ViewColorFgReadonly, m_colorMap["clrFgReadonly"]);
+    settings.setValue(IniKey_ViewColorFgSystem, m_colorMap["clrFgSystem"]);
+    settings.setValue(IniKey_ViewFont, m_model.font());
+}
+
+void PreferenceDialog::loadAppearance(QSettings &settings)
+{
+    QPalette palette;
+    QColor color;
+    QFont font;
+
     //>>>> アドレスボックス
     palette = QPalette();
     // 背景色
@@ -150,42 +214,6 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
     m_model.setFont(font);
     m_model.update();
 
-    //>>>>> ファイル操作
-    // 確認ダイアログの表示
-    ui->confirmCopy->setChecked(settings.value(IniKey_ConfirmCopy).toBool());
-    ui->confirmDelete->setChecked(settings.value(IniKey_ConfirmDelete).toBool());
-    ui->confirmMove->setChecked(settings.value(IniKey_ConfirmMove).toBool());
-    ui->confirmRename->setChecked(settings.value(IniKey_ConfirmRename).toBool());
-    // 完了ダイアログの自動クローズ
-    ui->autoCloseCopy->setChecked(settings.value(IniKey_AutoCloseCopy).toBool());
-    ui->autoCloseDelete->setChecked(settings.value(IniKey_AutoCloseDelete).toBool());
-    ui->autoCloseMove->setChecked(settings.value(IniKey_AutoCloseMove).toBool());
-    ui->autoCloseRename->setChecked(settings.value(IniKey_AutoCloseRename).toBool());
-    // 上書き時の既定動作
-    strValue = settings.value(IniKey_DefaultOnCopy).toString();
-    if (strValue.isEmpty()) {
-        strValue = "owDefIfNew";
-    }
-    radioBtn = findChild<QRadioButton*>(strValue);
-    if (radioBtn == NULL) {
-        radioBtn = ui->owDefIfNew;
-    }
-    radioBtn->setChecked(true);
-    ui->moveAfterCreate->setChecked(settings.value(IniKey_MoveAfterCreateFolder).toBool());
-    ui->openAfterCreate->setChecked(settings.value(IniKey_OpenAfterCreateFile).toBool());
-
-    //>>>>> パス設定
-    // エディタ
-    ui->editorOpt->setText(settings.value(IniKey_EditorOption).toString());
-    ui->editorPath->setText(settings.value(IniKey_EditorPath).toString());
-    // ターミナル
-    ui->termOpt->setText(settings.value(IniKey_TerminalOption).toString());
-    ui->termPath->setText(settings.value(IniKey_TerminalPath).toString());
-}
-
-PreferenceDialog::~PreferenceDialog()
-{
-    delete ui;
 }
 
 void PreferenceDialog::changeFont()
@@ -299,9 +327,21 @@ void PreferenceDialog::selectViewColor()
 
 void PreferenceDialog::browseApp()
 {
+    QStringList list = QStandardPaths::standardLocations(
+                QStandardPaths::ApplicationsLocation);
+#ifdef Q_OS_WIN
     QString path = QFileDialog::getOpenFileName(
-                this, tr("アプリケーションを選択"), "",
+                this, tr("アプリケーションを選択"), list.at(0),
                 tr("実行ファイル (*.exe *.com *.bat *.pif);;すべてのファイル (*)"));
+#elif defined(Q_OS_MAC)
+    QString path = QFileDialog::getOpenFileName(
+                this, tr("アプリケーションを選択"), list.at(0),
+                tr("実行ファイル (*.app);;すべてのファイル (*)"));
+#else
+    QString path = QFileDialog::getOpenFileName(
+                this, tr("アプリケーションを選択"), list.at(0),
+                tr("すべてのファイル (*)"));
+#endif
     if (!path.isEmpty()) {
         if (sender() == ui->editorBrowse) {
             ui->editorPath->setText(path);
@@ -312,6 +352,36 @@ void PreferenceDialog::browseApp()
     }
 }
 
+void PreferenceDialog::importAppearance()
+{
+    QStringList list = QStandardPaths::standardLocations(
+                QStandardPaths::DocumentsLocation);
+    QString path = QFileDialog::getOpenFileName(
+                this, tr("ファイルを選択"), list.at(0),
+                tr("設定ファイル (*.ini);;すべてのファイル (*)"));
+    if (path.isEmpty()) {
+        return;
+    }
+
+    QSettings settings(path, QSettings::IniFormat);
+    loadAppearance(settings);
+}
+
+void PreferenceDialog::exportAppearance()
+{
+    QStringList list = QStandardPaths::standardLocations(
+                QStandardPaths::DocumentsLocation);
+    QString path = QFileDialog::getSaveFileName(
+                this, tr("ファイルを選択"), list.at(0) + "/gefu_appearance.ini",
+                tr("設定ファイル (*.ini);;すべてのファイル (*)"));
+    if (path.isEmpty()) {
+        return;
+    }
+
+    QSettings settings(path, QSettings::IniFormat);
+    saveAppearance(settings);
+}
+
 void PreferenceDialog::accept()
 {
     QSettings settings;
@@ -354,20 +424,7 @@ void PreferenceDialog::accept()
     settings.setValue(IniKey_ResetOnBoot, ui->resetOnBoot->isChecked());
 
     //>>>>> 色とフォント
-    QFont font = ui->sampleEdit->font();
-    QPalette palette = ui->sampleEdit->palette();
-    settings.setValue(IniKey_BoxColorBg, palette.base().color());
-    settings.setValue(IniKey_BoxColorFg, palette.text().color());
-    settings.setValue(IniKey_BoxFont, font);
-
-    settings.setValue(IniKey_ViewColorBgMark, m_colorMap["clrBgMark"]);
-    settings.setValue(IniKey_ViewColorBgNormal, m_colorMap["clrBgNormal"]);
-    settings.setValue(IniKey_ViewColorFgHidden, m_colorMap["clrFgHidden"]);
-    settings.setValue(IniKey_ViewColorFgMark, m_colorMap["clrFgMark"]);
-    settings.setValue(IniKey_ViewColorFgNormal, m_colorMap["clrFgNormal"]);
-    settings.setValue(IniKey_ViewColorFgReadonly, m_colorMap["clrFgReadonly"]);
-    settings.setValue(IniKey_ViewColorFgSystem, m_colorMap["clrFgSystem"]);
-    settings.setValue(IniKey_ViewFont, m_model.font());
+    saveAppearance(settings);
 
     //>>>>> ファイル操作
     settings.setValue(IniKey_ConfirmCopy, ui->confirmCopy->isChecked());
@@ -393,6 +450,5 @@ void PreferenceDialog::accept()
     settings.setValue(IniKey_TerminalOption, ui->termOpt->text().trimmed());
     settings.setValue(IniKey_TerminalPath, ui->termPath->text().trimmed());
 
-
     QDialog::accept();
 }
index 3a7a191..b4a0ac5 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <QDialog>
 #include <QAbstractTableModel>
+#include <QSettings>
 
 namespace Ui {
 class PreferenceDialog;
@@ -23,12 +24,17 @@ private:
     ColorSampleModel m_model;
     ColorMap m_colorMap;
 
+    void saveAppearance(QSettings &settings);
+    void loadAppearance(QSettings &settings);
+
 private slots:
     void changeFont();
     void setControlsEnabled(bool enabled);
     void selectBoxColor();
     void selectViewColor();
     void browseApp();
+    void importAppearance();
+    void exportAppearance();
 
     // QDialog interface
 public slots:
index 480e4c9..e8e4e90 100644 (file)
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>631</width>
-    <height>527</height>
+    <height>569</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -26,7 +26,7 @@
       <enum>Qt::StrongFocus</enum>
      </property>
      <property name="currentIndex">
-      <number>2</number>
+      <number>0</number>
      </property>
      <widget class="QWidget" name="tabBoot_Exit">
       <attribute name="title">
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout">
        <item>
-        <widget class="QCheckBox" name="confirmExit">
-         <property name="focusPolicy">
-          <enum>Qt::StrongFocus</enum>
-         </property>
-         <property name="text">
-          <string>終了時に確認ダイアログを表示する</string>
-         </property>
-        </widget>
-       </item>
-       <item>
         <widget class="QCheckBox" name="bootSize">
          <property name="focusPolicy">
           <enum>Qt::StrongFocus</enum>
         </layout>
        </item>
        <item>
+        <widget class="QCheckBox" name="checkUpdates">
+         <property name="focusPolicy">
+          <enum>Qt::StrongFocus</enum>
+         </property>
+         <property name="text">
+          <string>起動時に最新バージョンをチェックする。</string>
+         </property>
+        </widget>
+       </item>
+       <item>
         <widget class="QCheckBox" name="resetOnBoot">
          <property name="focusPolicy">
           <enum>Qt::StrongFocus</enum>
         </widget>
        </item>
        <item>
+        <widget class="QCheckBox" name="confirmExit">
+         <property name="focusPolicy">
+          <enum>Qt::StrongFocus</enum>
+         </property>
+         <property name="text">
+          <string>終了時に確認ダイアログを表示する</string>
+         </property>
+        </widget>
+       </item>
+       <item>
         <spacer name="verticalSpacer">
          <property name="orientation">
           <enum>Qt::Vertical</enum>
         </widget>
        </item>
        <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_28">
+         <item>
+          <widget class="QPushButton" name="importAppearance">
+           <property name="focusPolicy">
+            <enum>Qt::StrongFocus</enum>
+           </property>
+           <property name="text">
+            <string>インポート</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="exportAppearance">
+           <property name="focusPolicy">
+            <enum>Qt::StrongFocus</enum>
+           </property>
+           <property name="text">
+            <string>エクスポート</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_17">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
         <spacer name="verticalSpacer_2">
          <property name="orientation">
           <enum>Qt::Vertical</enum>
         </layout>
        </item>
        <item>
-        <widget class="QTextEdit" name="optExplain">
+        <widget class="QPlainTextEdit" name="optExplain">
          <property name="font">
           <font>
-           <family>Courier</family>
+           <family>Monaco</family>
           </font>
          </property>
-         <property name="readOnly">
-          <bool>true</bool>
-         </property>
-         <property name="html">
-          <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
-&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
-p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Courier'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'.Lucida Grande UI';&quot;&gt;オプション引数に使える文字&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'.Lucida Grande UI';&quot;&gt;$B ... ファイル名から拡張子を除いた部分&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'.Lucida Grande UI';&quot;&gt;$E ... 拡張子&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'.Lucida Grande UI';&quot;&gt;$F ... ファイル名($B.$Eと同じ)&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'.Lucida Grande UI';&quot;&gt;$D ... フォルダ名&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'.Lucida Grande UI';&quot;&gt;$P ... フルパス($D/$Fと同じ)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+         <property name="plainText">
+          <string>オプション引数に使える文字
+$B ... ファイル名から拡張子を除いた部分
+$E ... 拡張子
+$F ... ファイル名($B.$Eと同じ)
+$D ... フォルダ名
+$P ... フルパス($D/$Fと同じ)</string>
          </property>
         </widget>
        </item>
@@ -1331,7 +1371,6 @@ p, li { white-space: pre-wrap; }
   </layout>
  </widget>
  <tabstops>
-  <tabstop>confirmExit</tabstop>
   <tabstop>bootSize</tabstop>
   <tabstop>sizeAbsolute</tabstop>
   <tabstop>absoluteWidth</tabstop>
@@ -1403,8 +1442,8 @@ p, li { white-space: pre-wrap; }
   </connection>
  </connections>
  <buttongroups>
-  <buttongroup name="posOptions"/>
-  <buttongroup name="overwriteOptions"/>
   <buttongroup name="sizeOptions"/>
+  <buttongroup name="overwriteOptions"/>
+  <buttongroup name="posOptions"/>
  </buttongroups>
 </ui>