#-------------------------------------------------
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 \
Gefu is an Experimental File Utility.
### TODO
-- 現在のフォルダを端末で開く
- コンテキストメニュー
- オプション
- ファンクションキー
- 簡易テキストビューア
- 簡易画像ビューア
- 簡易アーカイバ
-- 最新版チェック、ダウンロード
- SNS連携(タイムライン表示とか) ← ファイラーの機能か?
-#### 2014/08/23 Ver0.07
+#### 2014/08/23 Ver0.08
+- 「ターミナルで開く」を実装。
+- Shift+ダブルクリックで、ファイルを外部エディタで開くようにした。
+- Ctrl+ダブルクリックで、フォルダをターミナルで開くようにした。
+- 「色とフォント」にインポート・エクスポート機能を追加。
+- マスク表示(フィルタ)機能を追加。
+- 最新バージョンのチェック機能を追加。
+
+#### 2014/08/23 Ver0.07 公開
- ダブルクリック時、ファイルは標準の関連付けで実行するようにした。
- 設定項目追加。
- 「外部エディタで開く」を実装。
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
#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
#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
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
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
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
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
\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
}\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
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
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
\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
void showSystemFiles(bool show);\r
void setSort();\r
void refresh();\r
+ void setFilter();\r
\r
void back();\r
void forward();\r
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
model->updateAppearance();\r
ui->fileTable->setModel(model);\r
ui->fileTable->setRootPath(path, true);\r
+ onFilterChanged();\r
}\r
\r
void FolderPanel::updateAppearance()\r
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
\r
private slots:\r
void onStateChanged(int checkedFolders, int checkedFiles, quint64 totalSize);\r
+ void onFilterChanged();\r
void on_locationField_editingFinished();\r
};\r
\r
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
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
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
//>>>>> システムファイルの表示\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
#include <QDesktopWidget>\r
#include <QMessageBox>\r
#include <QSettings>\r
+#include <QNetworkAccessManager>\r
+#include <QNetworkReply>\r
\r
MainWindow::MainWindow(QWidget *parent) :\r
QMainWindow(parent),\r
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
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
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
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
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
#include <QMainWindow>\r
class FolderPanel;\r
class FileTableView;\r
+class QNetworkReply;\r
\r
namespace Ui {\r
class MainWindow;\r
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
<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>ヘルプ(&H)</string>\r
</property>\r
+ <addaction name="check_Update"/>\r
<addaction name="help_About"/>\r
</widget>\r
<addaction name="menu_File"/>\r
<string>></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
#include <QDebug>
#include <QDir>
#include <QFileDialog>
+#include <QStandardPaths>
PreferenceDialog::PreferenceDialog(QWidget *parent) :
QDialog(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()));
QString strValue;
QSize size;
QPoint point;
- QColor color;
- QPalette palette;
- QFont font;
QRadioButton *radioBtn;
//>>>>> 起動と終了
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();
// 背景色
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()
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);
}
}
+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;
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());
settings.setValue(IniKey_TerminalOption, ui->termOpt->text().trimmed());
settings.setValue(IniKey_TerminalPath, ui->termPath->text().trimmed());
-
QDialog::accept();
}
#include <QDialog>
#include <QAbstractTableModel>
+#include <QSettings>
namespace Ui {
class PreferenceDialog;
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:
<x>0</x>
<y>0</y>
<width>631</width>
- <height>527</height>
+ <height>569</height>
</rect>
</property>
<property name="sizePolicy">
<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><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Courier'; font-size:13pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'.Lucida Grande UI';">オプション引数に使える文字</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'.Lucida Grande UI';">$B ... ファイル名から拡張子を除いた部分</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'.Lucida Grande UI';">$E ... 拡張子</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'.Lucida Grande UI';">$F ... ファイル名($B.$Eと同じ)</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'.Lucida Grande UI';">$D ... フォルダ名</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'.Lucida Grande UI';">$P ... フルパス($D/$Fと同じ)</span></p></body></html></string>
+ <property name="plainText">
+ <string>オプション引数に使える文字
+$B ... ファイル名から拡張子を除いた部分
+$E ... 拡張子
+$F ... ファイル名($B.$Eと同じ)
+$D ... フォルダ名
+$P ... フルパス($D/$Fと同じ)</string>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
- <tabstop>confirmExit</tabstop>
<tabstop>bootSize</tabstop>
<tabstop>sizeAbsolute</tabstop>
<tabstop>absoluteWidth</tabstop>
</connection>
</connections>
<buttongroups>
- <buttongroup name="posOptions"/>
- <buttongroup name="overwriteOptions"/>
<buttongroup name="sizeOptions"/>
+ <buttongroup name="overwriteOptions"/>
+ <buttongroup name="posOptions"/>
</buttongroups>
</ui>