SOURCES += main.cpp\
mainwindow.cpp \
- folderpanel.cpp \
renamesingledialog.cpp \
renamemultidialog.cpp \
operationdialog.cpp \
copymoveworker.cpp \
sortdialog.cpp \
filetablemodel.cpp \
- filetableview.cpp \
history.cpp \
historydialog.cpp \
preferencedialog.cpp \
- clickablelabel.cpp \
colorsamplemodel.cpp \
- simpletextview.cpp
+ simpletextview.cpp \
+ searchbox.cpp \
+ folderview.cpp \
+ locationbox.cpp
HEADERS += mainwindow.h \
- folderpanel.h \
- singleton.hpp \
renamesingledialog.h \
renamemultidialog.h \
operationdialog.h \
copymoveworker.h \
sortdialog.h \
filetablemodel.h \
- filetableview.h \
history.h \
historydialog.h \
preferencedialog.h \
- clickablelabel.h \
colorsamplemodel.h \
- simpletextview.h
+ simpletextview.h \
+ searchbox.h \
+ folderview.h \
+ locationbox.h
FORMS += mainwindow.ui \
- folderpanel.ui \
renamesingledialog.ui \
renamemultidialog.ui \
operationdialog.ui \
OTHER_FILES += \
Gefu.rc \
- README.md
+ README.md \
+ ReadMe.txt
macx {
ICON = ./images/Gefu.icns
- オプション
- ファンクションキー
- キーバインドカスタマイズ
-- ファイル検索
- 簡易画像ビューア
- 簡易アーカイバ
- 簡易FTPクライアント
- SNS連携(タイムライン表示とか) ← ファイラーの機能か?
-#### 2014/08/24 Ver0.10
+#### 2014/08/25 Ver0.11 公開
+- ファイル検索機能を実装。
+- 内部構造を大幅に変更。
+ 各ビューで処理していたアクションを、メインウィンドウで処理するように変更。
+- 起動時の位置とサイズが常にデフォルト値になっていたのを修正。
+
+#### 2014/08/24 Ver0.10 公開
- 環境設定ダイアログの変更
- コントロールの活性・非活性切り替えを修正。
- フォント選択をダイアログ使用に変更。
===============================================================================
Gefu(げふぅ) - Gefu is an Experimental File Utility -
- Version 0.10
+ Version 0.11
===============================================================================
- 2014/08/24 @miyabi_satoh
+ 2014/08/25 @miyabi_satoh
◇ 概要 ◇
Twitter: https://twitter.com/miyabi_satoh
◇ 履歴 ◇
+#### 2014/08/25 Ver0.11
+- ファイル検索機能を実装。
+- 内部構造を大幅に変更。
+ (各ビューで処理していたアクションを、メインウィンドウで処理するように変更。)
+- 起動時の位置とサイズが常にデフォルト値になっていたのを修正。
+
#### 2014/08/24 Ver0.10
- SourceForge.jp でプロジェクト公開。
- 環境設定ダイアログの変更
typedef QMap<QString, QString> StringMap;\r
\r
class MainWindow;\r
+class QKeyEvent;\r
extern MainWindow* getMainWnd();\r
extern QString FilesizeToString(quint64 size);\r
extern QString ViewerIgnoreExt();\r
+extern QString KeyEventToSequence(const QKeyEvent *event);\r
\r
-#define VERSION_VALUE 0.10\r
+#define VERSION_VALUE 0.11\r
\r
#define slash QString("/")\r
#define QQ(x) ("\"" + QString(x) + "\"")\r
}\r
\r
bool ret;\r
- int copyMethod = OverWriteDialog::Undefined;\r
- int prevCopyMethod = OverWriteDialog::Undefined;\r
int successCount = 0;\r
int skipCount = 0;\r
int errorCount = 0;\r
int errDelCount = 0;\r
QString msg;\r
+ QString copyMethod;\r
QString alias;\r
StringMap::iterator it;\r
for (it = m_CopyMap.begin(); it != m_CopyMap.end(); it++) {\r
do { // コピーをスキップするのにbreakを使うがためのdo-while\r
if (tgtInfo.exists()) {\r
// 解決方法を選択\r
- if (copyMethod == OverWriteDialog::Undefined ||\r
- copyMethod == OverWriteDialog::Rename)\r
- {\r
- bool bOk;\r
- m_Asking = true;\r
- emit askOverWrite(&bOk, &prevCopyMethod, ©Method, &alias,\r
- srcInfo.absoluteFilePath(),\r
- tgtInfo.absoluteFilePath());\r
- while (isAsking()) {\r
- this->thread()->msleep(100);\r
- }\r
+ m_Asking = true;\r
+ emit askOverWrite(©Method,\r
+ &alias,\r
+ srcInfo.absoluteFilePath(),\r
+ tgtInfo.absoluteFilePath());\r
+\r
+ while (isAsking()) {\r
+ thread()->msleep(100);\r
+ }\r
\r
- if (!bOk) {\r
- requestStop();\r
- msg = tr("%1個のファイルをコピーしました。").arg(successCount);\r
- if (skipCount > 0) {\r
- msg += tr("%1個のファイルをスキップしました。").arg(skipCount);\r
- }\r
- if (errorCount > 0) {\r
- msg += tr("%1個のファイルをコピーできませんでした。").arg(errorCount);\r
- }\r
- m_progressText->setText(msg);\r
- emit canceled();\r
- return;\r
+ // キャンセルされた?\r
+ if (isStopRequested()) {\r
+ msg = tr("%1個のファイルをコピーしました。").arg(successCount);\r
+ if (skipCount > 0) {\r
+ msg += tr("%1個のファイルをスキップしました。").arg(skipCount);\r
}\r
+ if (errorCount > 0) {\r
+ msg += tr("%1個のファイルをコピーできませんでした。").arg(errorCount);\r
+ }\r
+ m_progressText->setText(msg);\r
+ emit canceled();\r
+ return;\r
}\r
\r
- if (prevCopyMethod == OverWriteDialog::OverWrite) {\r
+ if (copyMethod == "rbOverWrite") {\r
if (srcInfo.absoluteFilePath() == tgtInfo.absoluteFilePath()) {\r
emit success(tr("同一ファイルへの操作のためスキップ"));\r
skipCount++;\r
}\r
QFile(tgtInfo.absoluteFilePath()).remove();\r
}\r
- else if (prevCopyMethod == OverWriteDialog::OverWriteIfNew) {\r
+ else if (copyMethod == "rbOverWriteIfNew") {\r
if (srcInfo.lastModified() <= tgtInfo.lastModified()) {\r
emit success(tr("古いファイルのためスキップ"));\r
skipCount++;\r
}\r
QFile(tgtInfo.absoluteFilePath()).remove();\r
}\r
- else if (prevCopyMethod == OverWriteDialog::AppendNumber) {\r
+ else if (copyMethod == "rbAppendNumber") {\r
QString baseName = tgtInfo.baseName();\r
QString suffix = tgtInfo.completeSuffix();\r
for (int n = 1; ; n++) {\r
}\r
emit operation(tr("=>") + tgtInfo.fileName() + tr("にリネーム"));\r
}\r
- else if (prevCopyMethod == OverWriteDialog::Skip) {\r
+ else if (copyMethod == "rbSkip") {\r
emit success(tr("スキップ"));\r
skipCount++;\r
break;\r
}\r
- else if (prevCopyMethod == OverWriteDialog::Rename) {\r
+ else if (copyMethod == "rbRename") {\r
tgtInfo.setFile(tgtInfo.absolutePath(), alias);\r
emit operation(tr("=>") + tgtInfo.fileName() + tr("にリネーム"));\r
}\r
+ else {\r
+ qDebug() << "Unknown method : " << copyMethod;\r
+ Q_ASSERT(false);\r
+ }\r
}\r
\r
ret = QFile::copy(srcInfo.absoluteFilePath(), tgtInfo.absoluteFilePath());\r
emit error("元ファイルの削除に失敗");\r
}\r
}\r
-\r
}\r
else {\r
errorCount++;\r
}\r
\r
signals:\r
- void askOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod, QString *alias,\r
+ void askOverWrite(QString *copyMethod, QString *alias,\r
const QString &srcPath, const QString &tgtPath);\r
\r
public slots:\r
m_HiddenBrush(),\r
m_ReadonlyBrush()\r
{\r
+ // デフォルトフィルタを設定する\r
+ setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);\r
}\r
\r
bool FileTableModel::setPath(const QString &path)\r
}\r
else {\r
QFileInfoList::iterator it;\r
- bool removeDotDot = false;\r
for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); ) {\r
#ifdef Q_OS_WIN32\r
if (!(filter() & QDir::System)){\r
if (m_dir.isRoot()) {\r
qDebug() << m_dir.absolutePath() << " is root.";\r
it = m_fileInfoList.erase(it);\r
- removeDotDot = true;\r
continue;\r
}\r
}\r
it++;\r
}\r
// ソート方法によらず、".."は必ず先頭にする\r
- if (!removeDotDot) {\r
- QFileInfoList::iterator itRoot = m_fileInfoList.end();\r
- for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); it++) {\r
- if (it->fileName() == "..") {\r
- itRoot = it;\r
- break;\r
- }\r
- }\r
- if (itRoot != m_fileInfoList.end()) {\r
- QFileInfo info(*itRoot);\r
- m_fileInfoList.erase(itRoot);\r
- m_fileInfoList.push_front(info);\r
+ QFileInfoList::iterator itRoot = m_fileInfoList.end();\r
+ for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); it++) {\r
+ if (it->fileName() == "..") {\r
+ itRoot = it;\r
+ break;\r
}\r
}\r
+ if (itRoot != m_fileInfoList.end()) {\r
+ QFileInfo info(*itRoot);\r
+ m_fileInfoList.erase(itRoot);\r
+ m_fileInfoList.push_front(info);\r
+ }\r
}\r
\r
m_checkStates.resize(m_fileInfoList.size());\r
m_fsWatcher = new QFileSystemWatcher(this);\r
m_fsWatcher->addPath(path);\r
connect(m_fsWatcher, SIGNAL(directoryChanged(QString)),\r
- this, SIGNAL(listUpdated()));\r
+ this, SLOT(directoryChange(QString)));\r
\r
endResetModel();\r
\r
stateChanged();\r
}\r
\r
-#if 0\r
-bool FileTableModel::isDir(const QModelIndex &index) const\r
-{\r
- if (!index.isValid()) {\r
- qDebug() << "isDir() : index is invalid.";\r
- return QString();\r
- }\r
- return m_fileInfoList[index.row()].isDir();\r
-}\r
-\r
-const QString FileTableModel::absoluteFilePath(const QModelIndex &index) const\r
-{\r
- if (!index.isValid()) {\r
- qDebug() << "absoluteFilePath() : index is invalid.";\r
- return QString();\r
- }\r
-// return m_dir.absoluteFilePath(m_fileInfoList[index.row()].fileName());\r
- return m_fileInfoList[index.row()].absoluteFilePath();\r
-}\r
-\r
-const QString FileTableModel::fileName(const QModelIndex &index) const\r
-{\r
- if (!index.isValid()) {\r
- qDebug() << "fileName() : index is invalid.";\r
- return QString();\r
- }\r
- return m_fileInfoList[index.row()].fileName();\r
-}\r
-#endif\r
-\r
QFileInfo FileTableModel::fileInfo(const QModelIndex &index) const\r
{\r
if (!index.isValid()) {\r
endResetModel();\r
}\r
\r
+void FileTableModel::directoryChange(const QString &path)\r
+{\r
+ qDebug() << "FileTableModel::directoryChange";\r
+\r
+ setPath(path);\r
+}\r
+\r
void FileTableModel::stateChanged()\r
{\r
int numFolder = 0;\r
void setCheckState(const QModelIndex &index, Qt::CheckState state);\r
void setCheckStateAll(Qt::CheckState state);\r
const QString absolutePath() const { return m_dir.absolutePath(); }\r
-#if 0\r
- bool isDir(const QModelIndex &index) const;\r
- const QString absoluteFilePath(const QModelIndex &index) const;\r
- const QString fileName(const QModelIndex &index) const;\r
-#endif\r
+\r
QFileInfoList checkedItems() const;\r
QFileInfo fileInfo(const QModelIndex &index) const;\r
\r
void updateAppearance();\r
\r
+ QFont font() const { return m_font; }\r
+\r
signals:\r
void rootChanged(const QString &root);\r
void stateChanged(int checkedFoldrs, int checkedFiles, quint64 totalSize);\r
- void listUpdated();\r
\r
public slots:\r
+ void directoryChange(const QString &path);\r
\r
private:\r
QDir m_dir;\r
+#include "common.h"
#include "folderview.h"
+#include <QDebug>
+#include <QHeaderView>
+#include <QKeyEvent>
+#include <QSettings>
+
+QString FilesizeToString(quint64 size)
+{
+ if (size >= 1024 * 1024 * 1024) {
+ return QString("%1GB").arg(int(10 * size / (1024 * 1024 * 1024)) / 10);
+ }
+ if (size >= 1024 * 1024) {
+ return QString("%1MB").arg(int(10 * size / (1024 * 1024)) / 10);
+ }
+ if (size >= 1024) {
+ return QString("%1KB").arg(int(10 * size / (1024)) / 10);
+ }
+ return QString("%1B").arg(size);
+}
+
FolderView::FolderView(QWidget *parent) :
- QTableView(parent)
+ QTableView(parent),
+ m_model()
+{
+ setModel(&m_model);
+}
+
+QString FolderView::side() const
+{
+ if (this->objectName() == "folderView1") {
+ return QString("Left");
+ }
+ else {
+ Q_ASSERT(this->objectName() == "folderView2");
+ return QString("Right");
+ }
+}
+
+void FolderView::initialize()
+{
+ qDebug() << side() << "initialize";
+
+ QHeaderView *header;
+ // 列のリサイズモードを設定する
+ header = horizontalHeader();
+ header->setSectionResizeMode(QHeaderView::ResizeToContents);
+ header->setSectionResizeMode(1, QHeaderView::Stretch);
+
+ // 行の高さを設定する
+ header = verticalHeader();
+ header->setDefaultSectionSize(QFontMetrics(m_model.font()).height() * 1.5);
+
+ // 前回終了時のパスを開く
+ QSettings settings;
+ setPath(settings.value(side() + slash + IniKey_Dir).toString(), true);
+
+ // 色とフォントを設定する
+ updateAppearance();
+}
+
+void FolderView::updateAppearance()
+{
+ qDebug() << side() << "updateAppearance";
+ m_model.updateAppearance();
+
+ QSettings settings;
+ QPalette pal = palette();
+ pal.setColor(QPalette::Base, settings.value(IniKey_ViewColorBgNormal).value<QColor>());
+ setPalette(pal);
+}
+
+void FolderView::refresh()
+{
+ qDebug() << side() << "refresh";
+
+ int row = currentIndex().row();
+
+ setPath(m_model.absolutePath(), false);
+
+ if (row < 0) {
+ row = 0;
+ }
+ else if (row >= m_model.rowCount()) {
+ row = m_model.rowCount() - 1;
+ }
+ setCurrentIndex(m_model.index(row, 0));
+}
+
+void FolderView::searchItem(const QString &text)
+{
+ qDebug() << "FolderView::searchItem" << text;
+
+ for (int row = 0; row < m_model.rowCount(); row++) {
+ QModelIndex index = m_model.index(row, 0);
+ QString name = m_model.fileInfo(index).fileName().toLower();
+ if (name.indexOf(text.toLower()) != -1) {
+ setCurrentIndex(index);
+ emit itemFound(this);
+ return;
+ }
+ }
+
+ emit itemNotFound(this);
+}
+
+void FolderView::searchNext(const QString &text)
+{
+ qDebug() << "FolderView::searchNext" << text;
+
+ for (int row = currentIndex().row() + 1; row < m_model.rowCount(); row++) {
+ QModelIndex index = m_model.index(row, 0);
+ QString name = m_model.fileInfo(index).fileName().toLower();
+ if (name.indexOf(text.toLower()) != -1) {
+ setCurrentIndex(index);
+ emit itemFound(this);
+ return;
+ }
+ }
+
+ emit itemNotFound(this);
+}
+
+void FolderView::searchPrev(const QString &text)
+{
+ qDebug() << side() << "searchPrev" << text;
+
+ for (int row = currentIndex().row() - 1; row >= 0; row--) {
+ QModelIndex index = m_model.index(row, 0);
+ QString name = m_model.fileInfo(index).fileName().toLower();
+ if (name.indexOf(text.toLower()) != -1) {
+ setCurrentIndex(index);
+ emit itemFound(this);
+ return;
+ }
+ }
+
+ emit itemNotFound(this);
+}
+
+void FolderView::setCheckStateAll(bool checked)
{
+ qDebug() << side() << "markAll();";
+
+ QModelIndex current = currentIndex();
+
+ setUpdatesEnabled(false);
+ m_model.setCheckStateAll(checked ? Qt::Checked : Qt::Unchecked);
+ setUpdatesEnabled(true);
+
+ setCurrentIndex(current);
+}
+
+void FolderView::setCheckStateAllFiles()
+{
+ qDebug() << side() << "markAllFiles();";
+
+ QModelIndex current = currentIndex();
+
+ setUpdatesEnabled(false);
+ for (int n = 0; n < m_model.rowCount(); n++) {
+ QModelIndex index = m_model.index(n, 0);
+ QFileInfo info = m_model.fileInfo(index);
+ if (info.isDir()) {
+ m_model.setCheckState(index, Qt::Unchecked);
+ }
+ else {
+ m_model.setCheckState(index, Qt::Checked);
+ }
+ }
+ setUpdatesEnabled(true);
+
+ setCurrentIndex(current);
+}
+
+void FolderView::invertCheckState()
+{
+ qDebug() << side() << "invertCheckState();";
+
+ QModelIndex current = currentIndex();
+
+ setUpdatesEnabled(false);
+ for (int n = 0; n < m_model.rowCount(); n++) {
+ QModelIndex index = m_model.index(n, 0);
+ if (m_model.checkState(index) == Qt::Checked) {
+ m_model.setCheckState(index, Qt::Unchecked);
+ }
+ else {
+ m_model.setCheckState(index, Qt::Checked);
+ }
+ }
+ setUpdatesEnabled(true);
+
+ setCurrentIndex(current);
+}
+
+void FolderView::toggleCheckState(const QModelIndex &index)
+{
+ QFileInfo info = m_model.fileInfo(index);
+ if (info.fileName() != "..") {
+ if (m_model.checkState(index) == Qt::Checked) {
+ m_model.setCheckState(index, Qt::Unchecked);
+ }
+ else {
+ m_model.setCheckState(index, Qt::Checked);
+ }
+ }
+ // 最終行でなければ、次のアイテムに移動する
+ if (index.row() == m_model.rowCount() - 1) {
+ setCurrentIndex(index);
+ }
+ else if (index.row() < m_model.rowCount() - 1) {
+ setCurrentIndex(m_model.index(index.row() + 1, 1));
+ }
+}
+
+bool FolderView::historyBack()
+{
+ if (!m_history.isBegin()) {
+ setPath(m_history.back(), false);
+ return true;
+ }
+ return false;
+}
+
+bool FolderView::historyForward()
+{
+ if (!m_history.isEnd()) {
+ setPath(m_history.forward(), false);
+ return true;
+ }
+ return false;
+}
+
+QFileInfo FolderView::currentItem() const
+{
+ qDebug() << "FolderView::currentItem";
+
+ Q_ASSERT(currentIndex().isValid());
+
+ return m_model.fileInfo(currentIndex());
+}
+
+QFileInfoList FolderView::selectedItems() const
+{
+ qDebug() << side() << "selectedItems";
+
+ // マークされているアイテムを取得する
+ QFileInfoList list = m_model.checkedItems();
+
+ // 一つもマークされていなければ、カーソル位置のアイテムを取得する
+ if (list.isEmpty()) {
+ list << currentItem();
+ }
+
+ return list;
+}
+
+void FolderView::setPath(const QString &path, bool addHistory)
+{
+ qDebug() << side() << "setPath" << path << addHistory;
+
+ Q_ASSERT(QFileInfo(path).isDir());
+
+ emit retrieveStarted(path);
+
+ setUpdatesEnabled(false);
+ m_model.setPath(path);
+ setCurrentIndex(m_model.index(0, 0));
+ setUpdatesEnabled(true);
+
+ if (addHistory) {
+ m_history.add(path);
+ }
+
+ emit retrieveFinished();
+}
+
+void FolderView::setFilter(QDir::Filters filter, bool enable)
+{
+ qDebug() << side() << "setFilter" << enable;
+
+ if (enable) {
+ m_model.setFilter(m_model.filter() | filter);
+ }
+ else {
+ m_model.setFilter(m_model.filter() ^ filter);
+ }
+}
+
+void FolderView::setHistoryIndexAt(int index)
+{
+ m_history.setAt(index);
+ setPath(m_history.current(), false);
+}
+
+void FolderView::setNameFilters(const QStringList &list)
+{
+ m_model.setNameFilters(list);
+ refresh();
+}
+
+void FolderView::setSorting(QDir::SortFlags flags)
+{
+ m_model.setSorting(flags);
+ refresh();
+}
+
+void FolderView::keyPressEvent(QKeyEvent *event)
+{
+ qDebug() << side() << "keyPressEvent";
+
+ emit keyPressed(this, event);
+
+ if (!event->isAccepted()) {
+ QTableView::keyPressEvent(event);
+ }
+ else {
+ qDebug() << "KeyEvent accepted.";
+ }
}
#ifndef FOLDERVIEW_H
#define FOLDERVIEW_H
+#include "filetablemodel.h"
+#include "history.h"
+
#include <QTableView>
class FolderView : public QTableView
public:
explicit FolderView(QWidget *parent = 0);
+ QString side() const;
+
+ // actions
+ void initialize();
+ void updateAppearance();
+ void refresh();
+
+ void searchItem(const QString &text);
+ void searchNext(const QString &text);
+ void searchPrev(const QString &text);
+
+ void setCheckStateAll(bool checked);
+ void setCheckStateAllFiles();
+ void invertCheckState();
+ void toggleCheckState(const QModelIndex &index);
+
+ bool historyBack();
+ bool historyForward();
+
+
+ // getter
+ QFileInfo currentItem() const;
+ QString dir() const { return m_model.absolutePath(); }
+ QFileInfoList selectedItems() const;
+ const History* history() const { return &m_history; }
+ QStringList nameFilters() const { return m_model.nameFilters(); }
+
+ // setter
+ void setPath(const QString &path, bool addHistory);
+ void setFilter(QDir::Filters filter, bool enable);
+ void setHistoryIndexAt(int index);
+ void setNameFilters(const QStringList &list);
+ void setSorting(QDir::SortFlags flags);
+
+private:
+ FileTableModel m_model;
+ History m_history;
+
+
signals:
+ void itemFound(FolderView *view);
+ void itemNotFound(FolderView *view);
+ void retrieveStarted(const QString &path);
+ void retrieveFinished();
+ void keyPressed(FolderView *view, QKeyEvent *event);
public slots:
+
+ // QWidget interface
+protected:
+ void keyPressEvent(QKeyEvent *event);
+
};
#endif // FOLDERVIEW_H
delete ui;
}
-void HistoryDialog::setHistory(History *left, History *right)
+void HistoryDialog::setHistory(const History *left, const History *right)
{
m_leftHistory = left;
m_rightHistory = right;
explicit HistoryDialog(QWidget *parent = 0);
~HistoryDialog();
- void setHistory(History *left, History *right);
+ void setHistory(const History *left, const History *right);
void setDefaultLeft(bool bLeft);
int selectedIndex() const;
private:
Ui::HistoryDialog *ui;
- History *m_leftHistory;
- History *m_rightHistory;
- History *m_displaying;
+ const History *m_leftHistory;
+ const History *m_rightHistory;
+ const History *m_displaying;
private slots:
void showLeftHistory();
+#include "common.h"
#include "locationbox.h"
+#include <QDebug>
+#include <QSettings>
+
LocationBox::LocationBox(QWidget *parent) :
QLineEdit(parent)
{
}
+
+void LocationBox::initialize()
+{
+ qDebug() << "LocationBox::initialize";
+
+ updateAppearance();
+}
+
+void LocationBox::updateAppearance()
+{
+ qDebug() << "LocationBox::updateAppearance";
+
+ QSettings settings;
+
+ QPalette pal = palette();
+ pal.setColor(QPalette::Base, settings.value(IniKey_BoxColorBg).value<QColor>());
+ pal.setColor(QPalette::Text, settings.value(IniKey_BoxColorFg).value<QColor>());
+ setPalette(pal);
+
+ setFont(settings.value(IniKey_BoxFont).value<QFont>());
+}
public:
explicit LocationBox(QWidget *parent = 0);
+ void initialize();
+ void updateAppearance();
+
signals:
public slots:
\r
// 各オプションのデフォルト値を設定する\r
//>>>>> 起動と終了\r
- if (settings.value(IniKey_ConfirmExit, "").toString().isEmpty())\r
+ if (settings.value(IniKey_ConfirmExit, "").toString().isEmpty()) {\r
settings.setValue(IniKey_ConfirmExit, true);\r
- if (settings.value(IniKey_BootSizeAbs, "").toString().isEmpty()) {\r
settings.setValue(IniKey_BootSizeSpec, "sizeRelative");\r
settings.setValue(IniKey_BootSizeAbs, QSize(800,600));\r
settings.setValue(IniKey_BootSizeRel, QSize(75,75));\r
- }\r
- if (settings.value(IniKey_BootPosAbs, "").toString().isEmpty()) {\r
settings.setValue(IniKey_BootPosSpec, "posCenter");\r
settings.setValue(IniKey_BootPosAbs, QPoint(0, 0));\r
settings.setValue(IniKey_BootPosRel, QPoint(0, 0));\r
#include "common.h"\r
#include "mainwindow.h"\r
#include "preferencedialog.h"\r
-#include "filetableview.h"\r
+#include "folderview.h"\r
+#include "searchbox.h"\r
+#include "locationbox.h"\r
#include "ui_mainwindow.h"\r
+#include "copymoveworker.h"\r
+#include "operationdialog.h"\r
+#include "overwritedialog.h"\r
+#include "deleteworker.h"\r
+#include "renameworker.h"\r
+#include "renamesingledialog.h"\r
+#include "renamemultidialog.h"\r
+#include "historydialog.h"\r
+#include "sortdialog.h"\r
\r
#include <QCheckBox>\r
#include <QCloseEvent>\r
#include <QSettings>\r
#include <QNetworkAccessManager>\r
#include <QNetworkReply>\r
+#include <QInputDialog>\r
+#include <QProcess>\r
+#include <QDesktopServices>\r
+#include <QClipboard>\r
+#include <QFileDialog>\r
+\r
+MainWindow* getMainWnd()\r
+{\r
+ foreach (QWidget *w, qApp->topLevelWidgets()) {\r
+ if (w->objectName() == "MainWindow") {\r
+ return static_cast<MainWindow*>(w);\r
+ }\r
+ }\r
+ qDebug() << "MainWindow not found !?";\r
+ return NULL;\r
+}\r
\r
MainWindow::MainWindow(QWidget *parent) :\r
QMainWindow(parent),\r
ui(new Ui::MainWindow),\r
- m_focusedView(NULL)\r
+ m_focusedView(NULL),\r
+ m_overwriteDialog(NULL)\r
{\r
ui->setupUi(this);\r
- ui->RPanel->setSide("Right");\r
- ui->LPanel->setSide("Left");\r
- ui->LPanel->updateAppearance();\r
- ui->RPanel->updateAppearance();\r
\r
- QSettings settings;\r
- // メニュー項目の状態を初期化する\r
- if (settings.value(IniKey_ShowHidden).toBool()) {\r
- ui->view_Hidden->setChecked(true);\r
- }\r
- if (settings.value(IniKey_ShowSystem).toBool()) {\r
- ui->view_System->setChecked(true);\r
+ m_overwriteDialog = new OverWriteDialog(this);\r
+\r
+ initActionConnections();\r
+ connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(focusChange(QWidget*,QWidget*)));\r
+ connect(ui->textView, SIGNAL(viewFinished(QWidget*)), this, SLOT(viewFinish(QWidget*)));\r
+\r
+ // テキストビューアは初期状態で非表示\r
+ ui->textView->setVisible(false);\r
+\r
+ for (int i = 1; i <= 2; i++) {\r
+ LocationBox *locationBox = findChild<LocationBox*>(QString("locationBox%1").arg(i));\r
+ Q_CHECK_PTR(locationBox);\r
+\r
+ FolderView *folderView = findChild<FolderView*>(QString("folderView%1").arg(i));\r
+ Q_CHECK_PTR(folderView);\r
+\r
+ SearchBox *searchBox = findChild<SearchBox*>(QString("searchBox%1").arg(i));\r
+ Q_CHECK_PTR(searchBox);\r
+\r
+ // シグナル&スロット\r
+ connect(folderView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(open(QModelIndex)));\r
+ connect(folderView, SIGNAL(itemFound(FolderView*)), this, SLOT(itemFound(FolderView*)));\r
+ connect(folderView, SIGNAL(itemNotFound(FolderView*)), this, SLOT(itemNotFound(FolderView*)));\r
+ connect(folderView, SIGNAL(keyPressed(FolderView*,QKeyEvent*)), this, SLOT(keyPress(FolderView*,QKeyEvent*)));\r
+ connect(folderView, SIGNAL(retrieveFinished()), this, SLOT(retrieveFinish()));\r
+ connect(folderView, SIGNAL(retrieveStarted(QString)), this, SLOT(retrieveStart(QString)));\r
+ connect(searchBox, SIGNAL(textEdited(QString)), this, SLOT(searchItem(QString)));\r
+ connect(searchBox, SIGNAL(returnPressed()), this, SLOT(returnPressInSearchBox()));\r
+\r
+ // 検索ボックスは初期状態で非表示\r
+ searchBox->setVisible(false);\r
+\r
+ // ロケーションボックスを初期化する\r
+ locationBox->initialize();\r
+\r
+ // フィルタを初期化する\r
+ setNameFilters(folderView);\r
+\r
+ // ソートを初期化する\r
+ setSorting(folderView);\r
+\r
+ // フォルダビューを初期化する\r
+ folderView->initialize();\r
+\r
+ folderView->repaint();\r
}\r
- bool enabled;\r
- enabled = !settings.value(IniKey_EditorPath).toString().isEmpty();\r
- ui->action_OpenEditor->setEnabled(enabled);\r
\r
- enabled = !settings.value(IniKey_TerminalPath).toString().isEmpty();\r
- ui->action_OpenTerminal->setEnabled(enabled);\r
+ QSettings settings;\r
+ // メニュー項目の状態を初期化する\r
+ ui->view_Hidden->setChecked(settings.value(IniKey_ShowHidden).toBool());\r
+ ui->view_System->setChecked(settings.value(IniKey_ShowSystem).toBool());\r
+ ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());\r
+ ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());\r
\r
// 追加のショートカットキーを設定する\r
QList<QKeySequence> shortcuts;\r
shortcuts.append(QKeySequence("Shift+M"));\r
ui->action_Exec->setShortcuts(shortcuts);\r
\r
+ // MacだとShift+の形で認識されてしまうもの\r
shortcuts = ui->view_Filter->shortcuts();\r
shortcuts.append(QKeySequence("Shift+*")); // マヂで!?\r
ui->view_Filter->setShortcuts(shortcuts);\r
shortcuts.append(QKeySequence("Shift+?")); // マヂで!?\r
ui->help_About->setShortcuts(shortcuts);\r
\r
- // シグナル/スロットを設定する\r
- connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));\r
- connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));\r
- connect(ui->help_About, SIGNAL(triggered()), this, SLOT(about()));\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
- connect(ui->plainTextEdit, SIGNAL(viewFinished(QWidget*)), this, SLOT(viewFinish(QWidget*)));\r
-\r
// ウィンドウタイトルを設定する\r
setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));\r
+\r
// ウィンドウアイコンを設定する\r
-#if defined(Q_OS_MAC) || defined(Q_OS_MAC64) || defined(Q_OS_MACX)\r
+#if defined(Q_OS_MAC)\r
setWindowIcon(QIcon(":/images/Gefu.icns"));\r
#else\r
setWindowIcon(QIcon(":/images/Gefu.png"));\r
#endif\r
+\r
//>>>>> ウィンドウサイズと位置を設定する\r
QString strValue;\r
QPoint point = this->geometry().topLeft();\r
if (settings.value(IniKey_CheckUpdates).toBool()) {\r
checkUpdate(true);\r
}\r
-\r
-// ui->splitter->setVisible(false);\r
- ui->plainTextEdit->setVisible(false);\r
}\r
\r
MainWindow::~MainWindow()\r
delete ui;\r
}\r
\r
-FileTableView *MainWindow::otherSideView(const FileTableView *view) const\r
+FolderView* MainWindow::otherSideView(const FolderView *view) const\r
{\r
- QWidget *w = view->parentWidget();\r
- if (ui->LPanel == w) {\r
- return ui->RPanel->findChild<FileTableView*>("fileTable");\r
- }\r
- else if (ui->RPanel == w) {\r
- return ui->LPanel->findChild<FileTableView*>("fileTable");\r
+ qDebug() << "MainWindow::otherSideView()" << view->objectName();\r
+\r
+ if (view == ui->folderView1) {\r
+ return ui->folderView2;\r
}\r
\r
- qDebug() << w->objectName();\r
- return NULL;\r
+ Q_ASSERT(view == ui->folderView2);\r
+ return ui->folderView1;\r
}\r
\r
-void MainWindow::openRequest(const QFileInfo &info)\r
+void MainWindow::focusChange(QWidget *old, QWidget *now)\r
{\r
- m_focusedView = QApplication::focusWidget();\r
+ Q_UNUSED(old);\r
+ Q_UNUSED(now);\r
+ qDebug() << "MainWindow::focusChange";\r
\r
- setUpdatesEnabled(false);\r
+ updateActions();\r
+}\r
\r
- foreach (QObject *obj, this->children()) {\r
- QAction *action = qobject_cast<QAction*>(obj);\r
- if (action) {\r
- if (action->objectName() == "help_About" ||\r
- action->objectName() == "check_Update" ||\r
- action->objectName() == "copy_Fullpath" ||\r
- action->objectName() == "copy_Filename" ||\r
- action->objectName() == "action_Quit" ||\r
- action->objectName() == "action_Setting")\r
- {\r
- continue;\r
- }\r
- qDebug() << action->objectName();\r
- action->setEnabled(false);\r
+void MainWindow::executeCommand()\r
+{\r
+ qDebug() << "MainWindow::executeCommand";\r
+\r
+ FolderView *v = folderView();\r
+ Q_ASSERT(v);\r
+\r
+ QFileInfoList list = v->selectedItems();\r
+ QString command = QString::null;\r
+ foreach (const QFileInfo &info, list) {\r
+#ifdef Q_OS_MAC\r
+ QString path = info.absoluteFilePath();\r
+#else\r
+ QString path = info.fileName();\r
+#endif\r
+ if (info.isExecutable()) {\r
+ command = QQ(path) + " " + command;\r
+ }\r
+ else {\r
+ command += " " + QQ(path);\r
}\r
}\r
\r
- ui->menu_File->setVisible(false);\r
- ui->splitter->setVisible(false);\r
- ui->plainTextEdit->setVisible(true);\r
- ui->plainTextEdit->setFocus();\r
-\r
- setUpdatesEnabled(true);\r
+ QInputDialog dlg(this);\r
+ dlg.setInputMode(QInputDialog::TextInput);\r
+ dlg.setWindowTitle(tr("コマンドを実行"));\r
+ dlg.setLabelText(tr("コマンド:"));\r
+ dlg.setTextValue(command);\r
+ dlg.resize(width() * 0.8, dlg.height());\r
\r
- QFile file(info.absoluteFilePath());\r
- if (file.open(QIODevice::ReadOnly)) {\r
- ui->plainTextEdit->setSource(file.readAll());\r
+ int ret = dlg.exec();\r
+ command = dlg.textValue();\r
+ if (ret == QDialog::Accepted && !command.isEmpty()) {\r
+ startProcess(command, v->dir(), tr("コマンドの実行に失敗しました。"));\r
}\r
}\r
\r
-void MainWindow::showPreferenceDialog()\r
+void MainWindow::historyBack()\r
{\r
- PreferenceDialog dlg(this);\r
+ qDebug() << "MainWindow::historyBack();";\r
\r
- if (dlg.exec() == QDialog::Accepted) {\r
- ui->LPanel->updateAppearance();\r
- ui->RPanel->updateAppearance();\r
+ if (folderView()->historyBack()) {\r
+ updateActions();\r
+ }\r
+}\r
\r
- QSettings settings;\r
- bool enabled;\r
- enabled = !settings.value(IniKey_EditorPath).toString().isEmpty();\r
- ui->action_OpenEditor->setEnabled(enabled);\r
+void MainWindow::historyForward()\r
+{\r
+ qDebug() << "MainWindow::historyForward();";\r
\r
- enabled = !settings.value(IniKey_TerminalPath).toString().isEmpty();\r
- ui->action_OpenTerminal->setEnabled(enabled);\r
+ if (folderView()->historyForward()) {\r
+ updateActions();\r
}\r
}\r
\r
-void MainWindow::toggleShowHiddenFiles()\r
+void MainWindow::itemFound(FolderView *view)\r
{\r
- // キーボードがトリガーの場合、メニュー項目のチェック状態は\r
- // 変わらない(Mac)ので、QSettingsを使う\r
- QSettings settings;\r
- bool show = !settings.value(IniKey_ShowHidden).toBool();\r
- settings.setValue(IniKey_ShowHidden, show);\r
+ qDebug() << "MainWindow::itemFound";\r
\r
- ui->view_Hidden->setChecked(show);\r
+ SearchBox *box = searchBox(view);\r
+ QPalette pal = box->palette();\r
+ pal.setColor(QPalette::Text, QPalette().text().color());\r
+ box->setPalette(pal);\r
+}\r
+\r
+void MainWindow::itemNotFound(FolderView *view)\r
+{\r
+ qDebug() << "MainWindow::itemNotFound";\r
\r
- emit showHiddenFiles(show);\r
+ SearchBox *box = searchBox(view);\r
+ QPalette pal = box->palette();\r
+ pal.setColor(QPalette::Text, Qt::red);\r
+ box->setPalette(pal);\r
}\r
\r
-void MainWindow::toggleShowSystemFiles()\r
+void MainWindow::markAll()\r
{\r
- // キーボードがトリガーの場合、メニュー項目のチェック状態は\r
- // 変わらない(Mac)ので、QSettingsを使う\r
- QSettings settings;\r
- bool show = !settings.value(IniKey_ShowSystem).toBool();\r
- settings.setValue(IniKey_ShowSystem, show);\r
+ qDebug() << "MainWindow::markAll();";\r
\r
- ui->view_System->setChecked(show);\r
+ folderView()->setCheckStateAll(true);\r
+}\r
+\r
+void MainWindow::markAllFiles()\r
+{\r
+ qDebug() << "MainWindow::markAllFiles();";\r
\r
- emit showSystemFiles(show);\r
+ folderView()->setCheckStateAllFiles();\r
}\r
\r
-void MainWindow::checkUpdate(bool silent)\r
+void MainWindow::markAllOff()\r
{\r
- QNetworkAccessManager *manager = new QNetworkAccessManager(this);\r
+ qDebug() << "MainWindow::markAllOff();";\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("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_win.html")));\r
-#elif defined(Q_OS_MAC)\r
- manager->get(QNetworkRequest(QUrl("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_mac.html")));\r
-#endif\r
+ folderView()->setCheckStateAll(false);\r
}\r
\r
-void MainWindow::checkUpdateFinished(QNetworkReply *reply)\r
+void MainWindow::markInvert()\r
{\r
- checkUpdateFinished(reply, false);\r
+ qDebug() << "MainWindow::markInvert();";\r
+\r
+ folderView()->invertCheckState();\r
}\r
\r
-void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)\r
+void MainWindow::markToggle()\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
+ qDebug() << "MainWindow::markToggle();";\r
+\r
+ folderView()->toggleCheckState(folderView()->currentIndex());\r
+}\r
+\r
+void MainWindow::moveItems()\r
+{\r
+ qDebug() << "MainWindow::moveItems";\r
+\r
+ FolderView *v = folderView();\r
+ QFileInfoList list = v->selectedItems();\r
+ if (list.isEmpty()) {\r
+ return;\r
+ }\r
+\r
+ QSettings settings;\r
+ if (settings.value(IniKey_ConfirmCopy).toBool()) {\r
+ if (QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))\r
+ != QMessageBox::Yes)\r
+ {\r
+ return;\r
}\r
- else if (!silent) {\r
- QMessageBox::information(\r
- this, tr("情報"),\r
- tr("お使いのバージョンは最新です。"));\r
+ }\r
+\r
+ // 上書き確認ダイアログを初期化する\r
+ m_overwriteDialog->reset();\r
+\r
+ // ワーカースレッドを作成する\r
+ FolderView *other = otherSideView(v);\r
+ CopyMoveWorker *worker = new CopyMoveWorker();\r
+ connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
+ this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
+ worker->setCopyList(&list);\r
+ worker->setTargetDir(other->dir());\r
+ worker->setMoveMode(true);\r
+\r
+ // 進捗ダイアログを表示して、処理を開始する\r
+ OperationDialog opDlg(this);\r
+ opDlg.setWindowTitle(tr("移動"));\r
+ opDlg.setWorker(worker);\r
+ opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());\r
+\r
+ opDlg.exec();\r
+\r
+ settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());\r
+\r
+ // 念のため、リフレッシュ\r
+ ui->folderView1->refresh();\r
+ ui->folderView2->refresh();\r
+}\r
+\r
+void MainWindow::keyPress(FolderView *view, QKeyEvent *event)\r
+{\r
+ QString ksq = KeyEventToSequence(event);\r
+ if (ksq == "") {\r
+ event->ignore();\r
+ return;\r
+ }\r
+\r
+ qDebug() << "MainWindow::keyPress" << ksq;\r
+\r
+ foreach (QObject *obj, children()) {\r
+ QAction *action = qobject_cast<QAction*>(obj);\r
+ if (!action) {\r
+ continue;\r
+ }\r
+\r
+ foreach (const QKeySequence &k, action->shortcuts()) {\r
+ if (ksq == k.toString()) {\r
+ if (action->isEnabled()) {\r
+ if (action->isCheckable()) {\r
+ action->setChecked(!action->isChecked());\r
+ }\r
+ else {\r
+ emit action->triggered();\r
+ }\r
+ qDebug() << "emit" << action->objectName();\r
+ }\r
+ event->accept();\r
+ return;\r
+ }\r
}\r
}\r
- else if (!silent){\r
- QMessageBox::critical(\r
- this, tr("エラー"),\r
- tr("最新バージョンのチェックに失敗しました。<br/>") +\r
- reply->errorString());\r
+\r
+ if (ksq == "Left" || ksq == "Right") {\r
+ if (view->side() == ksq) {\r
+ }\r
+ else {\r
+ otherSideView(view)->setFocus();\r
+ }\r
+ event->accept();\r
+ return;\r
}\r
+\r
+ event->ignore();\r
}\r
\r
-void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)\r
+void MainWindow::returnPressInSearchBox()\r
{\r
- checkUpdateFinished(reply, true);\r
+ qDebug() << "MainWindow::returnPressInSearchBox";\r
+\r
+ if (QApplication::keyboardModifiers() & Qt::ShiftModifier) {\r
+ emit ui->action_SearchPrev->triggered();\r
+ }\r
+ else {\r
+ emit ui->action_SearchNext->triggered();\r
+ }\r
}\r
\r
-void MainWindow::viewFinish(QWidget *sender)\r
+void MainWindow::chooseFolder()\r
{\r
- setUpdatesEnabled(false);\r
+ qDebug() << "MainWindow::chooseFolder();";\r
\r
- foreach (QObject *obj, this->children()) {\r
- QAction *action = qobject_cast<QAction*>(obj);\r
- if (action) {\r
- action->setEnabled(true);\r
- }\r
+ QString path = QFileDialog::getExistingDirectory(\r
+ this, tr("フォルダを選択"), folderView()->dir());\r
+ if (!path.isEmpty()) {\r
+ folderView()->setPath(path, true);\r
+ updateActions();\r
}\r
+}\r
\r
- sender->setVisible(false);\r
- ui->splitter->setVisible(true);\r
- m_focusedView->setFocus();\r
+void MainWindow::copyFilenameToClipboard()\r
+{\r
+ qDebug() << "MainWindow::copyFilenameToClipboard();";\r
\r
- setUpdatesEnabled(true);\r
+ QClipboard *clipboard = QApplication::clipboard();\r
+ clipboard->setText(folderView()->currentItem().fileName());\r
}\r
\r
-void MainWindow::about()\r
+void MainWindow::copyFullpathTpClipboard()\r
{\r
- QMessageBox::about(\r
- this,\r
- tr("げふぅ について"),\r
- tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +\r
- tr("<center>Gefu is an Experimental File Utility.<br/>"\r
- "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"\r
- "<p>最新版の情報は<a href='http://miyabi.rakusaba.jp'>喫茶[雅]</a>で公開しています。</p>"\r
- "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));\r
+ qDebug() << "MainWindow::copyFullpathTpClipboard();";\r
+\r
+ QClipboard *clipboard = QApplication::clipboard();\r
+ clipboard->setText(folderView()->currentItem().absoluteFilePath());\r
}\r
\r
-MainWindow* getMainWnd()\r
+void MainWindow::askOverWrite(QString *copyMethod,\r
+ QString *alias,\r
+ const QString &srcPath,\r
+ const QString &tgtPath)\r
{\r
- foreach (QWidget *w, qApp->topLevelWidgets()) {\r
- if (w->objectName() == "MainWindow") {\r
- return static_cast<MainWindow*>(w);\r
+ qDebug() << "MainWindow::askOverWrite();";\r
+\r
+ CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());\r
+ if (!m_overwriteDialog->isKeepSetting() ||\r
+ m_overwriteDialog->copyMethod() == "rbRename")\r
+ {\r
+ m_overwriteDialog->setFileInfo(srcPath, tgtPath);\r
+ if (m_overwriteDialog->exec() == QDialog::Rejected) {\r
+ worker->requestStop();\r
}\r
}\r
- qDebug() << "MainWindow not found !?";\r
- return NULL;\r
-}\r
+ *copyMethod = m_overwriteDialog->copyMethod();\r
+ *alias = m_overwriteDialog->alias();\r
\r
+ worker->endAsking();\r
+}\r
\r
-void MainWindow::closeEvent(QCloseEvent *event)\r
+void MainWindow::copyItems()\r
{\r
+ qDebug() << "MainWindow::copyItems";\r
+\r
+ FolderView *v = folderView();\r
+ QFileInfoList list = v->selectedItems();\r
+ if (list.isEmpty()) {\r
+ return;\r
+ }\r
+\r
QSettings settings;\r
+ if (settings.value(IniKey_ConfirmCopy).toBool()) {\r
+ if (QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))\r
+ != QMessageBox::Yes)\r
+ {\r
+ return;\r
+ }\r
+ }\r
\r
- if (settings.value(IniKey_ConfirmExit).toBool()) {\r
- QMessageBox msgBox;\r
- QCheckBox *checkBox = new QCheckBox();\r
- checkBox->setText(tr("次回以降は確認しない"));\r
- msgBox.setCheckBox(checkBox);\r
- msgBox.setText(tr("終了しますか?"));\r
- msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);\r
- msgBox.setIcon(QMessageBox::Question);\r
+ // 上書き確認ダイアログを初期化する\r
+ m_overwriteDialog->reset();\r
\r
- if (msgBox.exec() == QMessageBox::No) {\r
- event->ignore();\r
+ // ワーカースレッドを作成する\r
+ FolderView *other = otherSideView(v);\r
+ CopyMoveWorker *worker = new CopyMoveWorker();\r
+ connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
+ this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
+ worker->setCopyList(&list);\r
+ worker->setTargetDir(other->dir());\r
+ worker->setMoveMode(false);\r
+\r
+ // 進捗ダイアログを表示して、処理を開始する\r
+ OperationDialog opDlg(this);\r
+ opDlg.setWindowTitle(tr("コピー"));\r
+ opDlg.setWorker(worker);\r
+ opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());\r
+\r
+ opDlg.exec();\r
+\r
+ settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());\r
+\r
+ // 念のため、リフレッシュ\r
+ ui->folderView1->refresh();\r
+ ui->folderView2->refresh();\r
+}\r
+\r
+void MainWindow::createFile()\r
+{\r
+ qDebug() << "MainWindow::createFile";\r
+\r
+ bool bOk;\r
+ QString name = QInputDialog::getText(\r
+ this, tr("ファイルを作成"), tr("ファイル名:"),\r
+ QLineEdit::Normal, "", &bOk);\r
+ if (!bOk || name.isEmpty()) {\r
+ return;\r
+ }\r
+\r
+ QDir dir(folderView()->dir());\r
+ QFile file(dir.absoluteFilePath(name));\r
+ if (!file.open(QIODevice::WriteOnly)) {\r
+ QMessageBox::critical(\r
+ this, tr("エラー"),\r
+ tr("ファイルの作成に失敗しました。"));\r
+ }\r
+ else {\r
+ file.close();\r
+\r
+ QSettings settings;\r
+ if (settings.value(IniKey_OpenAfterCreateFile).toBool()) {\r
+ openEditor(dir.absoluteFilePath(name));\r
+ }\r
+ }\r
+}\r
+\r
+void MainWindow::createFolder()\r
+{\r
+ qDebug() << "MainWindow::createFolder";\r
+\r
+ bool bOk;\r
+ QString name = QInputDialog::getText(\r
+ this, tr("フォルダを作成"), tr("フォルダ名:"),\r
+ QLineEdit::Normal, "", &bOk);\r
+ if (!bOk || name.isEmpty()) {\r
+ return;\r
+ }\r
+\r
+ QDir dir(folderView()->dir());\r
+ if (!dir.mkpath(name)) {\r
+ QMessageBox::critical(\r
+ this, tr("エラー"),\r
+ tr("フォルダの作成に失敗しました。"));\r
+ }\r
+ else {\r
+ QSettings settings;\r
+ if (settings.value(IniKey_MoveAfterCreateFolder).toBool()) {\r
+ folderView()->setPath(dir.absoluteFilePath(name), true);\r
+ updateActions();\r
+ }\r
+ }\r
+}\r
+\r
+void MainWindow::deleteItems()\r
+{\r
+ qDebug() << "MainWindow::deleteItems";\r
+\r
+ FolderView *v = folderView();\r
+ QFileInfoList list = v->selectedItems();\r
+ if (list.isEmpty()) {\r
+ return;\r
+ }\r
+\r
+ QSettings settings;\r
+ if (settings.value(IniKey_ConfirmDelete).toBool()) {\r
+ QString msg;\r
+ if (list.size() == 1) {\r
+ msg = list[0].fileName();\r
+ }\r
+ else {\r
+ msg = tr("%1個のアイテム").arg(list.size());\r
+ }\r
+ int ret = QMessageBox::question(\r
+ this, tr("確認"),\r
+ msg + tr("を削除しますか?"));\r
+ if (ret != QMessageBox::Yes) {\r
return;\r
}\r
- settings.setValue(IniKey_ConfirmExit, !checkBox->isChecked());\r
}\r
\r
- settings.setValue(IniKey_WindowGeometry, saveGeometry());\r
- settings.setValue(iniKey_WindowState, saveState());\r
- QMainWindow::closeEvent(event);\r
+ DeleteWorker *worker = new DeleteWorker();\r
+ worker->setDeleteList(&list);\r
+\r
+ OperationDialog opDlg(this);\r
+ opDlg.setWindowTitle(tr("削除"));\r
+ opDlg.setWorker(worker);\r
+ opDlg.setAutoClose(settings.value(IniKey_AutoCloseDelete).toBool());\r
+\r
+ opDlg.exec();\r
+\r
+ settings.setValue(IniKey_AutoCloseDelete, opDlg.autoClose());\r
+\r
+ // 念のため、リフレッシュ\r
+ ui->folderView1->refresh();\r
+ ui->folderView2->refresh();\r
+}\r
+\r
+void MainWindow::open(const QModelIndex &index)\r
+{\r
+ Q_UNUSED(index);\r
+ qDebug() << "MainWindow::open";\r
+\r
+ FolderView *v = folderView();\r
+ Q_ASSERT(v);\r
+\r
+ QFileInfo info = v->currentItem();\r
+ if (info.isDir()) {\r
+ v->setPath(info.absoluteFilePath(), true);\r
+ updateActions();\r
+ return;\r
+ }\r
+\r
+ QSettings settings;\r
+ if (!settings.value(IniKey_ViewerForceOpen).toBool()) {\r
+ QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");\r
+ foreach (const QString &ext, list) {\r
+ if (ext.toLower() == info.suffix().toLower()) {\r
+ shellExecute();\r
+ return;\r
+ }\r
+ }\r
+ }\r
+\r
+ setUpdatesEnabled(false);\r
+\r
+ foreach (QObject *obj, this->children()) {\r
+ QAction *action = qobject_cast<QAction*>(obj);\r
+ if (action) {\r
+ if (action->objectName() == "help_About" ||\r
+ action->objectName() == "check_Update" ||\r
+ action->objectName() == "copy_Fullpath" ||\r
+ action->objectName() == "copy_Filename" ||\r
+ action->objectName() == "action_Quit" ||\r
+ action->objectName() == "action_Setting")\r
+ {\r
+ continue;\r
+ }\r
+ action->setEnabled(false);\r
+ }\r
+ }\r
+\r
+ m_focusedView = folderView();\r
+ ui->splitter->setVisible(false);\r
+ ui->textView->setVisible(true);\r
+ ui->textView->setFocus();\r
+\r
+ setUpdatesEnabled(true);\r
+\r
+ QFile file(info.absoluteFilePath());\r
+ if (file.open(QIODevice::ReadOnly)) {\r
+ ui->textView->setSource(file.readAll());\r
+ }\r
+}\r
+\r
+void MainWindow::openEditor(const QString &path)\r
+{\r
+ qDebug() << "MainWindow::openEditor";\r
+\r
+ QSettings settings;\r
+ QString exe = settings.value(IniKey_EditorPath).toString();\r
+ if (exe.isEmpty()) {\r
+ QMessageBox::critical(\r
+ this, tr("エラー"),\r
+ tr("外部エディタのパスが未定義です。"));\r
+ return;\r
+ }\r
+\r
+ FolderView *v = folderView();\r
+ Q_ASSERT(v);\r
+\r
+ QFileInfoList list;\r
+ if (path.isEmpty()) {\r
+ list = v->selectedItems();\r
+ }\r
+ else {\r
+ list << path;\r
+ }\r
+\r
+ foreach (const QFileInfo &info, list) {\r
+ QString opt = settings.value(IniKey_EditorOption).toString();\r
+ replaceVars(opt, info);\r
+\r
+#ifdef Q_OS_MAC\r
+ QString command = "open -a " + exe + " " + opt;\r
+#else\r
+ QString command = QQ(exe) + " " + opt;\r
+#endif\r
+ if (!startProcess(command, info.absolutePath(), tr("外部エディタの起動に失敗しました。"))) {\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+void MainWindow::openTerminal()\r
+{\r
+ qDebug() << "MainWindow::openTerminal";\r
+\r
+ QSettings settings;\r
+ QString exe = settings.value(IniKey_TerminalPath).toString();\r
+ if (exe.isEmpty()) {\r
+ QMessageBox::critical(\r
+ this, tr("エラー"),\r
+ tr("ターミナルのパスが未定義です。"));\r
+ return;\r
+ }\r
+\r
+ FolderView *v = folderView();\r
+ Q_ASSERT(v);\r
+\r
+ foreach (const QFileInfo &info, v->selectedItems()) {\r
+ QString opt = settings.value(IniKey_TerminalOption).toString();\r
+ replaceVars(opt, info);\r
+\r
+#ifdef Q_OS_MAC\r
+ QString command = "open -a " + QQ(exe) + " --args " + opt;\r
+#else\r
+ QString command = QQ(exe) + " " + opt;\r
+#endif\r
+ if (!startProcess(command, info.absolutePath(), tr("ターミナルの起動に失敗しました。"))) {\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+void MainWindow::refresh()\r
+{\r
+ qDebug() << "MainWindow::refresh();";\r
+\r
+ folderView()->refresh();\r
+ updateActions();\r
+}\r
+\r
+void MainWindow::renameItems()\r
+{\r
+ qDebug() << "MainWindow::renameItems";\r
+\r
+ FolderView *v = folderView();\r
+\r
+ QFileInfoList list = v->selectedItems();\r
+ if (list.isEmpty()) {\r
+ return;\r
+ }\r
+\r
+ IRenameDialog *dlg;\r
+ if (list.size() == 1) {\r
+ dlg = new RenameSingleDialog(this);\r
+ }\r
+ else {\r
+ dlg = new RenameMultiDialog(this);\r
+ }\r
+ dlg->setWorkingDirectory(v->dir());\r
+ dlg->setNames(list);\r
+ int dlgResult = dlg->exec();\r
+ if (dlgResult != QDialog::Accepted || dlg->renameMap().isEmpty()) {\r
+ return;\r
+ }\r
+\r
+ QSettings settings;\r
+ if (settings.value(IniKey_ConfirmRename).toBool()) {\r
+ int ret = QMessageBox::question(this, tr("確認"),\r
+ tr("名前の変更を実行しますか?"));\r
+ if (ret != QMessageBox::Yes) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ RenameWorker *worker = new RenameWorker();\r
+ worker->setRenameMap(&dlg->renameMap());\r
+\r
+ OperationDialog opDlg(this);\r
+ opDlg.setWindowTitle(tr("名前を変更"));\r
+ opDlg.setWorker(worker);\r
+ opDlg.setAutoClose(settings.value(IniKey_AutoCloseRename).toBool());\r
+\r
+ opDlg.exec();\r
+\r
+ settings.setValue(IniKey_AutoCloseRename, opDlg.autoClose());\r
+}\r
+\r
+void MainWindow::retrieveFinish()\r
+{\r
+ qDebug() << "MainWindow::retrieveFinish();";\r
+\r
+ ui->statusBar->showMessage(tr("レディ"), 5000);\r
+}\r
+\r
+void MainWindow::retrieveStart(const QString &path)\r
+{\r
+ qDebug() << "MainWindow::retrieveStart();" << path;\r
+\r
+ ui->statusBar->showMessage(tr("ファイルリストを取得しています..."));\r
+ if (sender() == ui->folderView1) {\r
+ ui->locationBox1->setText(path);\r
+ }\r
+ else {\r
+ Q_ASSERT(sender() == ui->folderView2);\r
+ ui->locationBox2->setText(path);\r
+ }\r
+}\r
+\r
+void MainWindow::shellExecute()\r
+{\r
+ qDebug() << "MainWindow::shellExecute";\r
+\r
+ FolderView *v = folderView();\r
+ Q_ASSERT(v);\r
+\r
+ QFileInfoList list = v->selectedItems();\r
+ foreach (const QFileInfo &info, list) {\r
+ QString path = QDir::toNativeSeparators(info.absoluteFilePath());\r
+ QDesktopServices::openUrl(QUrl("file:///" + path));\r
+ }\r
+}\r
+\r
+void MainWindow::showFilterDialog()\r
+{\r
+ qDebug() << "MainWindow::showFilterDialog();";\r
+\r
+ QString filters = folderView()->nameFilters().join(" ");\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(width() * 0.8, dlg.height());\r
+\r
+ if (dlg.exec() == QDialog::Accepted) {\r
+ setNameFilters(folderView(), dlg.textValue());\r
+ }\r
+}\r
+\r
+void MainWindow::showHistoryDialog()\r
+{\r
+ qDebug() << "MainWindow::showHistoryDialog();";\r
+\r
+ FolderView *v = folderView();\r
+ FolderView *vOther = otherSideView(v);\r
+\r
+ HistoryDialog dlg(this);\r
+ if (v->side() == "Left") {\r
+ dlg.setDefaultLeft(true);\r
+ dlg.setHistory(v->history(), vOther->history());\r
+ }\r
+ else {\r
+ dlg.setDefaultLeft(false);\r
+ dlg.setHistory(vOther->history(), v->history());\r
+ }\r
+\r
+ if (dlg.exec() == QDialog::Accepted) {\r
+ if (v->side() == dlg.selectedSide()) {\r
+ v->setHistoryIndexAt(dlg.selectedIndex());\r
+ }\r
+ else {\r
+ v->setPath(vOther->history()->at(dlg.selectedIndex()), true);\r
+ }\r
+ updateActions();\r
+ }\r
+}\r
+\r
+void MainWindow::showSortDialog()\r
+{\r
+ qDebug() << "MainWindow::showSortDialog();";\r
+\r
+ SortDialog dlg(this);\r
+ dlg.setRightOrLeft(folderView()->side());\r
+\r
+ if (dlg.exec() != QDialog::Accepted) {\r
+ return;\r
+ }\r
+\r
+ setSorting(folderView());\r
+}\r
+\r
+void MainWindow::swapView()\r
+{\r
+ qDebug() << "MainWindow::swapView();";\r
+\r
+ QString dir1 = ui->folderView1->dir();\r
+ QString dir2 = ui->folderView2->dir();\r
+\r
+ ui->folderView1->setPath(dir2, true);\r
+ ui->folderView2->setPath(dir1, true);\r
+\r
+ updateActions();\r
+}\r
+\r
+void MainWindow::setSorting(FolderView *view)\r
+{\r
+ qDebug() << "MainWindow::setSorting();" << view->objectName();\r
+\r
+ QSettings settings;\r
+ QDir::SortFlags flags;\r
+\r
+ int sortBy = settings.value(view->side() + slash + IniKey_SortBy).toInt();\r
+ switch (sortBy) {\r
+ case SortByDate: flags |= QDir::Time; break;\r
+ case SortBySize: flags |= QDir::Size; break;\r
+ case SortByType: flags |= QDir::Type; break;\r
+ default: flags |= QDir::Name; break;\r
+ }\r
+\r
+ // デフォルトだと文字列は昇順で、数値は降順…orz\r
+ int orderBy = settings.value(view->side() + slash + IniKey_OrderBy).toInt();\r
+ if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
+ ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
+ {\r
+ flags |= QDir::Reversed;\r
+ }\r
+\r
+ switch (settings.value(view->side() + slash + IniKey_PutDirs).toInt()) {\r
+ case PutDirsFirst: flags |= QDir::DirsFirst; break;\r
+ case PutDirsLast: flags |= QDir::DirsLast; break;\r
+ }\r
+\r
+ if (settings.value(view->side() + slash + IniKey_IgnoreCase).toBool()) {\r
+ flags |= QDir::IgnoreCase;\r
+ }\r
+\r
+ view->setSorting(flags);\r
+}\r
+\r
+void MainWindow::searchItem(const QString &text)\r
+{\r
+ qDebug() << "MainWindow::searchItem" << text;\r
+\r
+ FolderView *v;\r
+ SearchBox *box;\r
+ if (ui->searchBox1->hasFocus()) {\r
+ v = ui->folderView1;\r
+ box = ui->searchBox1;\r
+ }\r
+ else {\r
+ Q_ASSERT(ui->searchBox2->hasFocus());\r
+ v = ui->folderView2;\r
+ box = ui->searchBox2;\r
+ }\r
+\r
+ if (text.right(1) == "/") {\r
+ box->setText(text.left(text.length() - 1));\r
+ ui->action_Search->setChecked(false);\r
+ return;\r
+ }\r
+\r
+ v->searchItem(box->text());\r
+}\r
+\r
+void MainWindow::searchNext()\r
+{\r
+ qDebug() << "MainWindow::searchNext";\r
+\r
+ FolderView *v = folderView();\r
+ SearchBox *box = searchBox(v);\r
+ v->searchNext(box->text());\r
+}\r
+\r
+void MainWindow::searchPrev()\r
+{\r
+ qDebug() << "MainWindow::searchPrev";\r
+\r
+ FolderView *v = folderView();\r
+ SearchBox *box = searchBox(v);\r
+ v->searchPrev(box->text());\r
+}\r
+\r
+void MainWindow::setCursorToBegin()\r
+{\r
+ qDebug() << "MainWindow::setCursorToBegin();";\r
+\r
+ FolderView *v = folderView();\r
+ int row = 0;\r
+ v->setCurrentIndex(v->model()->index(row, 0));\r
+}\r
+\r
+void MainWindow::cursorDown()\r
+{\r
+ qDebug() << "MainWindow::cursorDown();";\r
+\r
+ FolderView *v = folderView();\r
+ int row = v->currentIndex().row() + 1;\r
+ if (row < v->model()->rowCount()) {\r
+ v->setCurrentIndex(v->model()->index(row, 0));\r
+ }\r
+}\r
+\r
+void MainWindow::cursorUp()\r
+{\r
+ qDebug() << "MainWindow::cursorUp();";\r
+\r
+ FolderView *v = folderView();\r
+ int row = v->currentIndex().row() - 1;\r
+ if (row >= 0) {\r
+ v->setCurrentIndex(v->model()->index(row, 0));\r
+ }\r
+}\r
+\r
+void MainWindow::setCursorToEnd()\r
+{\r
+ qDebug() << "MainWindow::setCursorToEnd();";\r
+\r
+ FolderView *v = folderView();\r
+ int row = v->model()->rowCount() - 1;\r
+ v->setCurrentIndex(v->model()->index(row, 0));\r
+}\r
+\r
+void MainWindow::setPathFromOther()\r
+{\r
+ qDebug() << "MainWindow::setPathFromOther();";\r
+\r
+ FolderView *view = folderView();\r
+ FolderView *other = otherSideView(view);\r
+\r
+ view->setPath(other->dir(), true);\r
+ updateActions();\r
+}\r
+\r
+void MainWindow::setPathToHome()\r
+{\r
+ qDebug() << "MainWindow::setPathToHome();";\r
+\r
+ folderView()->setPath(QDir::homePath(), true);\r
+ updateActions();\r
+}\r
+\r
+void MainWindow::setPathToOther()\r
+{\r
+ qDebug() << "MainWindow::setPathToOther();";\r
+\r
+ FolderView *view = folderView();\r
+ FolderView *other = otherSideView(view);\r
+\r
+ other->setPath(view->dir(), true);\r
+ updateActions();\r
+}\r
+\r
+void MainWindow::setPathToParent()\r
+{\r
+ qDebug() << "MainWindow::setPathToParent();";\r
+\r
+ QDir dir(folderView()->dir());\r
+ if (!dir.isRoot()) {\r
+ dir.cdUp();\r
+ folderView()->setPath(dir.absolutePath(), true);\r
+ updateActions();\r
+ }\r
+}\r
+\r
+void MainWindow::setPathToRoot()\r
+{\r
+ qDebug() << "MainWindow::setPathToRoot();";\r
+\r
+ folderView()->setPath(QDir::rootPath(), true);\r
+ updateActions();\r
+}\r
+\r
+void MainWindow::toggleSearchBox(bool checked)\r
+{\r
+ qDebug() << "MainWindow::toggleSearchBox" << checked;\r
+\r
+ FolderView *v;\r
+ SearchBox *box;\r
+\r
+ if (checked) {\r
+ v = folderView();\r
+ if (v == ui->folderView1) {\r
+ box = ui->searchBox1;\r
+ }\r
+ else {\r
+ Q_ASSERT(v == ui->folderView2);\r
+ box = ui->searchBox2;\r
+ }\r
+\r
+ box->setVisible(true);\r
+ box->setFocus();\r
+ box->selectAll();\r
+ }\r
+ else {\r
+ if (ui->searchBox1->isVisible()) {\r
+ box = ui->searchBox1;\r
+ v = ui->folderView1;\r
+ }\r
+ else {\r
+ Q_ASSERT(ui->searchBox2->isVisible());\r
+ box = ui->searchBox2;\r
+ v = ui->folderView2;\r
+ }\r
+\r
+ if (box->hasFocus()) {\r
+ v->setFocus();\r
+ }\r
+ box->setVisible(false);\r
+ }\r
+}\r
+\r
+void MainWindow::openRequest(const QFileInfo &info)\r
+{\r
+ m_focusedView = QApplication::focusWidget();\r
+\r
+ QFile file(info.absoluteFilePath());\r
+ if (file.open(QIODevice::ReadOnly)) {\r
+ ui->splitter->setVisible(false);\r
+ ui->textView->setVisible(true);\r
+ ui->textView->setFocus();\r
+ ui->textView->setSource(file.readAll());\r
+ }\r
+ else {\r
+ QMessageBox::critical(\r
+ this, tr("エラー"),\r
+ tr("ファイルの読み込みに失敗しました。"));\r
+ }\r
+}\r
+\r
+void MainWindow::showPreferenceDialog()\r
+{\r
+ qDebug() << "MainWindow::showPreferenceDialog";\r
+\r
+ PreferenceDialog dlg(this);\r
+ if (dlg.exec() == QDialog::Accepted) {\r
+ ui->locationBox1->updateAppearance();\r
+ ui->locationBox2->updateAppearance();\r
+ ui->folderView1->updateAppearance();\r
+ ui->folderView2->updateAppearance();\r
+\r
+ updateActions();\r
+ }\r
+}\r
+\r
+void MainWindow::toggleShowHiddenFiles(bool checked)\r
+{\r
+ qDebug() << "MainWindow::toggleShowHiddenFiles" << checked;\r
+\r
+ ui->folderView1->setFilter(QDir::Hidden, checked);\r
+ ui->folderView1->refresh();\r
+\r
+ ui->folderView2->setFilter(QDir::Hidden, checked);\r
+ ui->folderView2->refresh();\r
+}\r
+\r
+void MainWindow::toggleShowSystemFiles(bool checked)\r
+{\r
+ qDebug() << "MainWindow::toggleShowSystemFiles" << checked;\r
+\r
+ ui->folderView1->setFilter(QDir::System, checked);\r
+ ui->folderView1->refresh();\r
+\r
+ ui->folderView2->setFilter(QDir::System, checked);\r
+ ui->folderView2->refresh();\r
+}\r
+\r
+void MainWindow::checkUpdate(bool silent)\r
+{\r
+ qDebug() << "MainWindow::checkUpdate()" << silent;\r
+\r
+ QNetworkAccessManager *manager = new QNetworkAccessManager(this);\r
+\r
+ if (silent) {\r
+ connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));\r
+ }\r
+ else {\r
+ connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinished(QNetworkReply*)));\r
+ }\r
+#ifdef Q_OS_WIN\r
+ manager->get(QNetworkRequest(QUrl("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_win.html")));\r
+#elif defined(Q_OS_MAC)\r
+ manager->get(QNetworkRequest(QUrl("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_mac.html")));\r
+#endif\r
+}\r
+\r
+void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)\r
+{\r
+ qDebug() << "MainWindow::checkUpdateFinishedSilent";\r
+\r
+ checkUpdateFinished(reply, true);\r
+}\r
+\r
+void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)\r
+{\r
+ qDebug() << "MainWindow::checkUpdateFinished" << 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::viewFinish(QWidget *sender)\r
+{\r
+ qDebug() << "MainWindow::viewFinish();" << sender->objectName();\r
+\r
+ sender->setVisible(false);\r
+ ui->splitter->setVisible(true);\r
+ m_focusedView->setFocus();\r
+}\r
+\r
+\r
+void MainWindow::initActionConnections()\r
+{\r
+ qDebug() << "MainWindow::initActionConnections";\r
+\r
+ connect(ui->action_Command, SIGNAL(triggered()), this, SLOT(executeCommand()));\r
+ connect(ui->action_Exec, SIGNAL(triggered()), this, SLOT(shellExecute()));\r
+ connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(open()));\r
+ connect(ui->action_OpenEditor, SIGNAL(triggered()), this, SLOT(openEditor()));\r
+ connect(ui->action_OpenTerminal, SIGNAL(triggered()), this, SLOT(openTerminal()));\r
+ connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));\r
+ connect(ui->action_Search, SIGNAL(toggled(bool)), this, SLOT(toggleSearchBox(bool)));\r
+ connect(ui->action_SearchNext, SIGNAL(triggered()), this, SLOT(searchNext()));\r
+ connect(ui->action_SearchPrev, SIGNAL(triggered()), this, SLOT(searchPrev()));\r
+ connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));\r
+ connect(ui->check_Update, SIGNAL(triggered()), this, SLOT(checkUpdate()));\r
+ connect(ui->cmd_Copy, SIGNAL(triggered()), this, SLOT(copyItems()));\r
+ connect(ui->cmd_Delete, SIGNAL(triggered()), this, SLOT(deleteItems()));\r
+ connect(ui->cmd_Move, SIGNAL(triggered()), this, SLOT(moveItems()));\r
+ connect(ui->cmd_NewFile, SIGNAL(triggered()), this, SLOT(createFile()));\r
+ connect(ui->cmd_NewFolder, SIGNAL(triggered()), this, SLOT(createFolder()));\r
+ connect(ui->cmd_Rename, SIGNAL(triggered()), this, SLOT(renameItems()));\r
+ connect(ui->copy_Filename, SIGNAL(triggered()), this, SLOT(copyFilenameToClipboard()));\r
+ connect(ui->copy_Fullpath, SIGNAL(triggered()), this, SLOT(copyFullpathTpClipboard()));\r
+ connect(ui->help_About, SIGNAL(triggered()), this, SLOT(about()));\r
+ connect(ui->mark_All, SIGNAL(triggered()), this, SLOT(markAll()));\r
+ connect(ui->mark_AllFiles, SIGNAL(triggered()), this, SLOT(markAllFiles()));\r
+ connect(ui->mark_AllOff, SIGNAL(triggered()), this, SLOT(markAllOff()));\r
+ connect(ui->mark_Invert, SIGNAL(triggered()), this, SLOT(markInvert()));\r
+ connect(ui->mark_Toggle, SIGNAL(triggered()), this, SLOT(markToggle()));\r
+ connect(ui->move_Back, SIGNAL(triggered()), this, SLOT(historyBack()));\r
+ connect(ui->move_Begin, SIGNAL(triggered()), this, SLOT(setCursorToBegin()));\r
+ connect(ui->move_Down, SIGNAL(triggered()), this, SLOT(cursorDown()));\r
+ connect(ui->move_End, SIGNAL(triggered()), this, SLOT(setCursorToEnd()));\r
+ connect(ui->move_Forward, SIGNAL(triggered()), this, SLOT(historyForward()));\r
+ connect(ui->move_History, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));\r
+ connect(ui->move_Home, SIGNAL(triggered()), this, SLOT(setPathToHome()));\r
+ connect(ui->move_Jump, SIGNAL(triggered()), this, SLOT(chooseFolder()));\r
+ connect(ui->move_Parent, SIGNAL(triggered()), this, SLOT(setPathToParent()));\r
+ connect(ui->move_Root, SIGNAL(triggered()), this, SLOT(setPathToRoot()));\r
+ connect(ui->move_Up, SIGNAL(triggered()), this, SLOT(cursorUp()));\r
+ connect(ui->view_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));\r
+ connect(ui->view_FromOther, SIGNAL(triggered()), this, SLOT(setPathFromOther()));\r
+ connect(ui->view_Hidden, SIGNAL(toggled(bool)), this, SLOT(toggleShowHiddenFiles(bool)));\r
+ connect(ui->view_Refresh, SIGNAL(triggered()), this, SLOT(refresh()));\r
+ connect(ui->view_Sort, SIGNAL(triggered()), this, SLOT(showSortDialog()));\r
+ connect(ui->view_Swap, SIGNAL(triggered()), this, SLOT(swapView()));\r
+ connect(ui->view_System, SIGNAL(toggled(bool)), this, SLOT(toggleShowSystemFiles(bool)));\r
+ connect(ui->view_ToOther, SIGNAL(triggered()), this, SLOT(setPathToOther()));\r
+}\r
+\r
+FolderView *MainWindow::folderView() const\r
+{\r
+ qDebug() << "MainWindow::folderView";\r
+\r
+ QWidget *w = qApp->focusWidget();\r
+ if (w == ui->folderView1 || w == ui->searchBox1 || w == ui->locationBox1) {\r
+ return ui->folderView1;\r
+ }\r
+ if (w == ui->folderView2 || w == ui->searchBox2 || w == ui->locationBox2) {\r
+ return ui->folderView2;\r
+ }\r
+\r
+ qDebug() << w->objectName();\r
+ return NULL;\r
+}\r
+\r
+void MainWindow::replaceVars(QString &str, const QFileInfo info)\r
+{\r
+ qDebug() << "MainWindow::replaceVars" << str;\r
+\r
+ str.replace("$B", info.completeBaseName());\r
+ str.replace("$E", info.suffix());\r
+ str.replace("$F", info.fileName());\r
+ if (info.isDir()) {\r
+ str.replace("$D", info.absoluteFilePath());\r
+ }\r
+ else {\r
+ str.replace("$D", info.absolutePath());\r
+ }\r
+ str.replace("$P", info.absoluteFilePath());\r
+}\r
+\r
+SearchBox *MainWindow::searchBox(FolderView *view) const\r
+{\r
+ qDebug() << "MainWindow::searchBox()" << view->objectName();\r
+\r
+ if (view == ui->folderView1) {\r
+ return ui->searchBox1;\r
+ }\r
+ else {\r
+ Q_ASSERT(view == ui->folderView2);\r
+ return ui->searchBox2;\r
+ }\r
+}\r
+\r
+bool MainWindow::startProcess(const QString &cmd, const QString &workDir, const QString &errMsg)\r
+{\r
+ qDebug() << "MainWindow::startProcess" << cmd << workDir << errMsg;\r
+\r
+ QProcess process(this);\r
+ process.setWorkingDirectory(workDir);\r
+ if (!process.startDetached(cmd)) {\r
+ QMessageBox::critical(this, tr("エラー"), errMsg + "<br/>" + cmd);\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+void MainWindow::updateActions()\r
+{\r
+ qDebug() << "MainWindow::updateActions";\r
+\r
+ if (ui->textView->hasFocus()) {\r
+ // テキストビューア時\r
+ setEnabledAllActions(false);\r
+ ui->action_Quit->setEnabled(true);\r
+ ui->action_Setting->setEnabled(true);\r
+ ui->check_Update->setEnabled(true);\r
+ ui->copy_Filename->setEnabled(true);\r
+ ui->copy_Fullpath->setEnabled(true);\r
+ ui->help_About->setEnabled(true);\r
+ }\r
+ else if (ui->searchBox1->hasFocus() || ui->searchBox2->hasFocus()) {\r
+ // ファイル検索時\r
+ setEnabledAllActions(false);\r
+ ui->action_Search->setEnabled(true);\r
+ ui->action_SearchNext->setEnabled(true);\r
+ ui->action_SearchPrev->setEnabled(true);\r
+ ui->help_About->setEnabled(true);\r
+ ui->action_Quit->setEnabled(true);\r
+ }\r
+ else if (ui->folderView1->hasFocus() || ui->folderView2->hasFocus()) {\r
+ // 通常時\r
+ setEnabledAllActions(true);\r
+ ui->action_SearchNext->setEnabled(false);\r
+ ui->action_SearchPrev->setEnabled(false);\r
+\r
+ ui->move_Back->setEnabled(!folderView()->history()->isBegin());\r
+ ui->move_Forward->setEnabled(!folderView()->history()->isEnd());\r
+\r
+ QSettings settings;\r
+ ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());\r
+ ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());\r
+ }\r
+}\r
+\r
+void MainWindow::setEnabledAllActions(bool enable)\r
+{\r
+ qDebug() << "MainWindow::setEnabledAllActions();" << enable;\r
+ foreach (QObject *obj, children()) {\r
+ QAction *action = qobject_cast<QAction*>(obj);\r
+ if (action) {\r
+ action->setEnabled(enable);\r
+ }\r
+ }\r
+}\r
+\r
+void MainWindow::setNameFilters(FolderView *view, const QString &filters)\r
+{\r
+ qDebug() << "MainWindow::setNameFilters();" << view->objectName() << filters;\r
+\r
+ QStringList list = filters.split(" ", QString::SkipEmptyParts);\r
+ if (list.isEmpty()) {\r
+ list << "*";\r
+ }\r
+ view->setNameFilters(list);\r
+ filterLabel(view)->setText(tr("フィルタ:") + list.join(" "));\r
+}\r
+\r
+QLabel *MainWindow::filterLabel(const FolderView *view) const\r
+{\r
+ qDebug() << "MainWindow::filterLabel()" << view->objectName();\r
+ if (view == ui->folderView1) {\r
+ return ui->filterLabel1;\r
+ }\r
+ else {\r
+ Q_ASSERT(view == ui->folderView2);\r
+ return ui->filterLabel2;\r
+ }\r
+}\r
+\r
+void MainWindow::about()\r
+{\r
+ QMessageBox::about(\r
+ this,\r
+ tr("げふぅ について"),\r
+ tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +\r
+ tr("<center>Gefu is an Experimental File Utility.<br/>"\r
+ "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"\r
+ "<p>最新版の情報は<a href='http://miyabi.rakusaba.jp'>喫茶[雅]</a>で公開しています。</p>"\r
+ "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));\r
+}\r
+\r
+void MainWindow::closeEvent(QCloseEvent *event)\r
+{\r
+ QSettings settings;\r
+\r
+ if (settings.value(IniKey_ConfirmExit).toBool()) {\r
+ QMessageBox msgBox;\r
+ QCheckBox *checkBox = new QCheckBox();\r
+ checkBox->setText(tr("次回以降は確認しない"));\r
+ msgBox.setCheckBox(checkBox);\r
+ msgBox.setText(tr("終了しますか?"));\r
+ msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);\r
+ msgBox.setIcon(QMessageBox::Question);\r
+\r
+ if (msgBox.exec() == QMessageBox::No) {\r
+ event->ignore();\r
+ return;\r
+ }\r
+ settings.setValue(IniKey_ConfirmExit, !checkBox->isChecked());\r
+ }\r
+\r
+ settings.setValue(QString("Left/") + IniKey_Dir, ui->folderView1->dir());\r
+ settings.setValue(QString("Right/") + IniKey_Dir, ui->folderView2->dir());\r
+ settings.setValue(IniKey_ShowHidden, ui->view_Hidden->isChecked());\r
+ settings.setValue(IniKey_ShowSystem, ui->view_System->isChecked());\r
+ settings.setValue(IniKey_WindowGeometry, saveGeometry());\r
+ settings.setValue(iniKey_WindowState, saveState());\r
+ QMainWindow::closeEvent(event);\r
+}\r
+\r
+\r
+void MainWindow::keyPressEvent(QKeyEvent *event)\r
+{\r
+ QString ksq = KeyEventToSequence(event);\r
+ qDebug() << ksq << " @MainWindow";\r
+\r
+ QMainWindow::keyPressEvent(event);\r
}\r
#define MAINWINDOW_H\r
\r
#include <QFileInfo>\r
+#include <QModelIndex>\r
#include <QMainWindow>\r
-class FolderPanel;\r
-class FileTableView;\r
class QNetworkReply;\r
+class FolderView;\r
+class SearchBox;\r
+class OverWriteDialog;\r
+class QLabel;\r
\r
namespace Ui {\r
class MainWindow;\r
}\r
\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief The MainWindow class\r
+///\r
class MainWindow : public QMainWindow\r
{\r
Q_OBJECT\r
explicit MainWindow(QWidget *parent = 0);\r
~MainWindow();\r
\r
- FileTableView* otherSideView(const FileTableView *view) const;\r
+ FolderView *otherSideView(const FolderView *view) const;\r
\r
signals:\r
void showHiddenFiles(bool show);\r
void showSystemFiles(bool show);\r
\r
public slots:\r
+ void askOverWrite(QString *copyMethod, QString *alias,\r
+ const QString &srcPath, const QString &tgtPath);\r
+\r
+ void focusChange(QWidget * old, QWidget * now);\r
+ void keyPress(FolderView *view, QKeyEvent *event);\r
+ void returnPressInSearchBox();\r
+\r
+ void chooseFolder();\r
+ void copyFilenameToClipboard();\r
+ void copyFullpathTpClipboard();\r
+ void copyItems();\r
+ void createFile();\r
+ void createFolder();\r
+ void cursorDown();\r
+ void cursorUp();\r
+ void deleteItems();\r
+ void executeCommand();\r
+ void historyBack();\r
+ void historyForward();\r
+ void itemFound(FolderView *view);\r
+ void itemNotFound(FolderView *view);\r
+ void markAll();\r
+ void markAllFiles();\r
+ void markAllOff();\r
+ void markInvert();\r
+ void markToggle();\r
+ void moveItems();\r
+ void open(const QModelIndex &index = QModelIndex());\r
+ void openEditor(const QString &path = QString());\r
+ void openTerminal();\r
+ void refresh();\r
+ void renameItems();\r
+ void retrieveFinish();\r
+ void retrieveStart(const QString &path);\r
+ void searchItem(const QString& text);\r
+ void searchNext();\r
+ void searchPrev();\r
+ void setCursorToBegin();\r
+ void setCursorToEnd();\r
+ void setPathFromOther();\r
+ void setPathToHome();\r
+ void setPathToOther();\r
+ void setPathToParent();\r
+ void setPathToRoot();\r
+ void shellExecute();\r
+ void showFilterDialog();\r
+ void showHistoryDialog();\r
+ void showSortDialog();\r
+ void swapView();\r
+ void toggleSearchBox(bool checked);\r
+\r
+\r
+\r
\r
-private slots:\r
void openRequest(const QFileInfo &info);\r
void showPreferenceDialog();\r
void about();\r
- void toggleShowHiddenFiles();\r
- void toggleShowSystemFiles();\r
+ void toggleShowHiddenFiles(bool checked);\r
+ void toggleShowSystemFiles(bool checked);\r
void checkUpdate(bool silent = false);\r
- void checkUpdateFinished(QNetworkReply *reply);\r
- void checkUpdateFinished(QNetworkReply *reply, bool silent);\r
+ void checkUpdateFinished(QNetworkReply *reply, bool silent = false);\r
void checkUpdateFinishedSilent(QNetworkReply *reply);\r
void viewFinish(QWidget *sender);\r
\r
private:\r
Ui::MainWindow *ui;\r
QWidget *m_focusedView;\r
+ OverWriteDialog *m_overwriteDialog;\r
+\r
+ // action\r
+ void initActionConnections();\r
+ static void replaceVars(QString &str, const QFileInfo info);\r
+ bool startProcess(const QString &cmd, const QString &workDir, const QString &errMsg);\r
+ void updateActions();\r
+ void setEnabledAllActions(bool enable);\r
+ void setNameFilters(FolderView *view, const QString& filters = QString());\r
+ void setSorting(FolderView *view);\r
+\r
+ // getter\r
+ QLabel* filterLabel(const FolderView *view) const;\r
+ FolderView* folderView() const;\r
+ SearchBox* searchBox(FolderView *view) const;\r
+\r
\r
// QWidget interface\r
protected:\r
void closeEvent(QCloseEvent *event);\r
+ void keyPressEvent(QKeyEvent *event);\r
};\r
\r
#endif // MAINWINDOW_H\r
<rect>\r
<x>0</x>\r
<y>0</y>\r
- <width>665</width>\r
- <height>337</height>\r
+ <width>828</width>\r
+ <height>531</height>\r
</rect>\r
</property>\r
<property name="windowTitle">\r
<string>MainWindow</string>\r
</property>\r
<property name="windowIcon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Gefu.png</normaloff>:/images/Gefu.png</iconset>\r
</property>\r
<widget class="QWidget" name="centralWidget">\r
- <layout class="QVBoxLayout" name="verticalLayout">\r
+ <layout class="QVBoxLayout" name="verticalLayout_3">\r
<property name="spacing">\r
<number>0</number>\r
</property>\r
<property name="orientation">\r
<enum>Qt::Horizontal</enum>\r
</property>\r
- <widget class="FolderPanel" name="LPanel" native="true">\r
- <property name="sizePolicy">\r
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">\r
- <horstretch>0</horstretch>\r
- <verstretch>0</verstretch>\r
- </sizepolicy>\r
- </property>\r
+ <widget class="QWidget" name="">\r
+ <layout class="QVBoxLayout" name="verticalLayout_2">\r
+ <property name="spacing">\r
+ <number>0</number>\r
+ </property>\r
+ <item>\r
+ <widget class="LocationBox" name="locationBox1">\r
+ <property name="focusPolicy">\r
+ <enum>Qt::ClickFocus</enum>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="FolderView" name="folderView1">\r
+ <property name="verticalScrollBarPolicy">\r
+ <enum>Qt::ScrollBarAlwaysOn</enum>\r
+ </property>\r
+ <property name="horizontalScrollBarPolicy">\r
+ <enum>Qt::ScrollBarAlwaysOff</enum>\r
+ </property>\r
+ <property name="tabKeyNavigation">\r
+ <bool>false</bool>\r
+ </property>\r
+ <property name="dragEnabled">\r
+ <bool>true</bool>\r
+ </property>\r
+ <property name="dragDropMode">\r
+ <enum>QAbstractItemView::DragDrop</enum>\r
+ </property>\r
+ <property name="defaultDropAction">\r
+ <enum>Qt::CopyAction</enum>\r
+ </property>\r
+ <property name="alternatingRowColors">\r
+ <bool>false</bool>\r
+ </property>\r
+ <property name="selectionMode">\r
+ <enum>QAbstractItemView::SingleSelection</enum>\r
+ </property>\r
+ <property name="selectionBehavior">\r
+ <enum>QAbstractItemView::SelectRows</enum>\r
+ </property>\r
+ <property name="textElideMode">\r
+ <enum>Qt::ElideMiddle</enum>\r
+ </property>\r
+ <property name="showGrid">\r
+ <bool>false</bool>\r
+ </property>\r
+ <property name="wordWrap">\r
+ <bool>false</bool>\r
+ </property>\r
+ <attribute name="horizontalHeaderHighlightSections">\r
+ <bool>false</bool>\r
+ </attribute>\r
+ <attribute name="verticalHeaderVisible">\r
+ <bool>false</bool>\r
+ </attribute>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="SearchBox" name="searchBox1">\r
+ <property name="focusPolicy">\r
+ <enum>Qt::ClickFocus</enum>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QLabel" name="filterLabel1">\r
+ <property name="text">\r
+ <string>TextLabel</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ </layout>\r
</widget>\r
- <widget class="FolderPanel" name="RPanel" native="true">\r
- <property name="sizePolicy">\r
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">\r
- <horstretch>0</horstretch>\r
- <verstretch>0</verstretch>\r
- </sizepolicy>\r
- </property>\r
+ <widget class="QWidget" name="">\r
+ <layout class="QVBoxLayout" name="verticalLayout">\r
+ <property name="spacing">\r
+ <number>0</number>\r
+ </property>\r
+ <item>\r
+ <widget class="LocationBox" name="locationBox2">\r
+ <property name="focusPolicy">\r
+ <enum>Qt::ClickFocus</enum>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="FolderView" name="folderView2">\r
+ <property name="verticalScrollBarPolicy">\r
+ <enum>Qt::ScrollBarAlwaysOn</enum>\r
+ </property>\r
+ <property name="horizontalScrollBarPolicy">\r
+ <enum>Qt::ScrollBarAlwaysOff</enum>\r
+ </property>\r
+ <property name="tabKeyNavigation">\r
+ <bool>false</bool>\r
+ </property>\r
+ <property name="dragEnabled">\r
+ <bool>true</bool>\r
+ </property>\r
+ <property name="dragDropMode">\r
+ <enum>QAbstractItemView::DragDrop</enum>\r
+ </property>\r
+ <property name="defaultDropAction">\r
+ <enum>Qt::CopyAction</enum>\r
+ </property>\r
+ <property name="alternatingRowColors">\r
+ <bool>false</bool>\r
+ </property>\r
+ <property name="selectionMode">\r
+ <enum>QAbstractItemView::SingleSelection</enum>\r
+ </property>\r
+ <property name="selectionBehavior">\r
+ <enum>QAbstractItemView::SelectRows</enum>\r
+ </property>\r
+ <property name="textElideMode">\r
+ <enum>Qt::ElideMiddle</enum>\r
+ </property>\r
+ <property name="showGrid">\r
+ <bool>false</bool>\r
+ </property>\r
+ <property name="wordWrap">\r
+ <bool>false</bool>\r
+ </property>\r
+ <attribute name="horizontalHeaderHighlightSections">\r
+ <bool>false</bool>\r
+ </attribute>\r
+ <attribute name="verticalHeaderVisible">\r
+ <bool>false</bool>\r
+ </attribute>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="SearchBox" name="searchBox2">\r
+ <property name="focusPolicy">\r
+ <enum>Qt::ClickFocus</enum>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QLabel" name="filterLabel2">\r
+ <property name="text">\r
+ <string>TextLabel</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ </layout>\r
</widget>\r
</widget>\r
</item>\r
<item>\r
- <widget class="SimpleTextView" name="plainTextEdit"/>\r
+ <widget class="SimpleTextView" name="textView"/>\r
</item>\r
<item>\r
<layout class="QHBoxLayout" name="horizontalLayout">\r
<attribute name="toolBarBreak">\r
<bool>false</bool>\r
</attribute>\r
- <addaction name="action_Exec"/>\r
+ <addaction name="action_Open"/>\r
<addaction name="action_OpenEditor"/>\r
- <addaction name="action_Command"/>\r
+ <addaction name="action_Search"/>\r
<addaction name="separator"/>\r
<addaction name="mark_All"/>\r
<addaction name="mark_AllFiles"/>\r
<rect>\r
<x>0</x>\r
<y>0</y>\r
- <width>665</width>\r
+ <width>828</width>\r
<height>22</height>\r
</rect>\r
</property>\r
<addaction name="action_OpenTerminal"/>\r
<addaction name="action_Command"/>\r
<addaction name="separator"/>\r
+ <addaction name="action_Search"/>\r
+ <addaction name="action_SearchNext"/>\r
+ <addaction name="action_SearchPrev"/>\r
+ <addaction name="separator"/>\r
<addaction name="action_Setting"/>\r
<addaction name="separator"/>\r
<addaction name="action_Quit"/>\r
</widget>\r
<action name="action_Quit">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Exit.png</normaloff>:/images/Exit.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="action_Open">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Open.png</normaloff>:/images/Open.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="action_Exec">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Play.png</normaloff>:/images/Play.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="view_FromOther">\r
<property name="icon">\r
- <iconset theme="隣のパネルと同じフォルダを表示">\r
+ <iconset theme="隣のパネルと同じフォルダを表示" resource="resource.qrc">\r
<normaloff>:/images/Synchronize.png</normaloff>:/images/Synchronize.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="mark_All">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Ok.png</normaloff>:/images/Ok.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="mark_AllFiles">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Check boxes.png</normaloff>:/images/Check boxes.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="mark_AllOff">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Cancel.png</normaloff>:/images/Cancel.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="view_Swap">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Text replace.png</normaloff>:/images/Text replace.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="action_Setting">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Settings.png</normaloff>:/images/Settings.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="move_Down">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Go down.png</normaloff>:/images/Go down.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="move_Up">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Go up.png</normaloff>:/images/Go up.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="move_Back">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Back.png</normaloff>:/images/Back.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="move_Forward">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Forward.png</normaloff>:/images/Forward.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="move_Parent">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Up.png</normaloff>:/images/Up.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="move_Root">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Monitor.png</normaloff>:/images/Monitor.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="move_Jump">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Folder.png</normaloff>:/images/Folder.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="move_Home">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Home.png</normaloff>:/images/Home.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="action_OpenEditor">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Edit page.png</normaloff>:/images/Edit page.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="action_Command">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Export.png</normaloff>:/images/Export.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="cmd_Copy">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Copy.png</normaloff>:/images/Copy.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="cmd_Move">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Paste.png</normaloff>:/images/Paste.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="cmd_Delete">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Delete.png</normaloff>:/images/Delete.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="cmd_Rename">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Rename.png</normaloff>:/images/Rename.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="cmd_NewFile">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/New file.png</normaloff>:/images/New file.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="cmd_NewFolder">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Add folder.png</normaloff>:/images/Add folder.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="help_About">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Help.png</normaloff>:/images/Help.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="view_Refresh">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Refresh.png</normaloff>:/images/Refresh.png</iconset>\r
</property>\r
<property name="text">\r
</action>\r
<action name="view_Filter">\r
<property name="icon">\r
- <iconset>\r
+ <iconset resource="resource.qrc">\r
<normaloff>:/images/Funnel.png</normaloff>:/images/Funnel.png</iconset>\r
</property>\r
<property name="text">\r
<string>Shift+C</string>\r
</property>\r
</action>\r
+ <action name="action_Search">\r
+ <property name="checkable">\r
+ <bool>true</bool>\r
+ </property>\r
+ <property name="icon">\r
+ <iconset resource="resource.qrc">\r
+ <normaloff>:/images/Search.png</normaloff>:/images/Search.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="action_SearchNext">\r
+ <property name="text">\r
+ <string>次を検索</string>\r
+ </property>\r
+ <property name="toolTip">\r
+ <string>次を検索</string>\r
+ </property>\r
+ <property name="shortcut">\r
+ <string>Return</string>\r
+ </property>\r
+ </action>\r
+ <action name="action_SearchPrev">\r
+ <property name="text">\r
+ <string>前を検索</string>\r
+ </property>\r
+ <property name="toolTip">\r
+ <string>前を検索</string>\r
+ </property>\r
+ <property name="shortcut">\r
+ <string>Shift+Return</string>\r
+ </property>\r
+ </action>\r
</widget>\r
<layoutdefault spacing="6" margin="11"/>\r
<customwidgets>\r
<customwidget>\r
- <class>FolderPanel</class>\r
- <extends>QWidget</extends>\r
- <header>folderpanel.h</header>\r
- <container>1</container>\r
- </customwidget>\r
- <customwidget>\r
<class>SimpleTextView</class>\r
<extends>QPlainTextEdit</extends>\r
<header>simpletextview.h</header>\r
</customwidget>\r
+ <customwidget>\r
+ <class>SearchBox</class>\r
+ <extends>QLineEdit</extends>\r
+ <header>searchbox.h</header>\r
+ </customwidget>\r
+ <customwidget>\r
+ <class>FolderView</class>\r
+ <extends>QTableView</extends>\r
+ <header>folderview.h</header>\r
+ </customwidget>\r
+ <customwidget>\r
+ <class>LocationBox</class>\r
+ <extends>QLineEdit</extends>\r
+ <header>locationbox.h</header>\r
+ </customwidget>\r
</customwidgets>\r
- <resources/>\r
+ <resources>\r
+ <include location="resource.qrc"/>\r
+ </resources>\r
<connections/>\r
</ui>\r
+#include "common.h"\r
#include "overwritedialog.h"\r
#include "ui_overwritedialog.h"\r
+\r
#include <QDir>\r
#include <QMessageBox>\r
#include <QDateTime>\r
+#include <QSettings>\r
\r
OverWriteDialog::OverWriteDialog(QWidget *parent) :\r
QDialog(parent),\r
{\r
ui->setupUi(this);\r
\r
- ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);\r
- ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);\r
+ QHeaderView *header = ui->tableWidget->horizontalHeader();\r
+ header->setSectionResizeMode(QHeaderView::ResizeToContents);\r
+ header->setSectionResizeMode(0, QHeaderView::Stretch);\r
\r
connect(ui->rbAppendNumber, SIGNAL(clicked()), this, SLOT(onRenameOrElse()));\r
connect(ui->rbOverWrite, SIGNAL(clicked()), this, SLOT(onRenameOrElse()));\r
connect(ui->rbOverWriteIfNew, SIGNAL(clicked()), this, SLOT(onRenameOrElse()));\r
connect(ui->rbRename, SIGNAL(clicked()), this, SLOT(onRenameOrElse()));\r
connect(ui->rbSkip, SIGNAL(clicked()), this, SLOT(onRenameOrElse()));\r
-\r
}\r
\r
OverWriteDialog::~OverWriteDialog()\r
delete ui;\r
}\r
\r
-void OverWriteDialog::setCopyMethod(int method)\r
+void OverWriteDialog::reset()\r
{\r
- switch (method) {\r
- case OverWriteDialog::OverWrite:\r
- ui->rbOverWrite->setChecked(true);\r
- break;\r
- case OverWriteDialog::AppendNumber:\r
- ui->rbAppendNumber->setChecked(true);\r
- break;\r
- case OverWriteDialog::Skip:\r
- ui->rbSkip->setChecked(true);\r
- break;\r
- case OverWriteDialog::Rename:\r
- ui->rbRename->setChecked(true);\r
- ui->lineEdit->setFocus();\r
- break;\r
- default:\r
- ui->rbOverWriteIfNew->setChecked(true);\r
- break;\r
+ QSettings settings;\r
+ QString method = settings.value(IniKey_DefaultOnCopy).toString();\r
+ QRadioButton *radio = findChild<QRadioButton*>(method);\r
+ if (radio == NULL) {\r
+ radio = ui->rbOverWriteIfNew;\r
}\r
- onRenameOrElse();\r
-}\r
+ radio->setChecked(true);\r
\r
-void OverWriteDialog::setSameMethodChecked(bool checked)\r
-{\r
- ui->checkBox->setChecked(checked);\r
+ ui->keepSetting->setChecked(false);\r
}\r
\r
void OverWriteDialog::setFileInfo(const QString srcPath, const QString tgtPath)\r
m_tgtPath = tgtPath;\r
ui->lineEdit->setText(tgtInfo.fileName());\r
\r
+ QTableWidgetItem *iSrcName = new QTableWidgetItem(srcInfo.fileName());\r
+ iSrcName->setFlags(iSrcName->flags() ^ Qt::ItemIsEditable);\r
+ iSrcName->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);\r
+ ui->tableWidget->setItem(0, 0, iSrcName);\r
+\r
+ QTableWidgetItem *iTgtName = new QTableWidgetItem(tgtInfo.fileName());\r
+ iTgtName->setFlags(iTgtName->flags() ^ Qt::ItemIsEditable);\r
+ iTgtName->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);\r
+ ui->tableWidget->setItem(0, 0, iTgtName);\r
+\r
QTableWidgetItem *iSrcSize = new QTableWidgetItem(tr("%1 Bytes").arg(srcInfo.size()));\r
iSrcSize->setFlags(iSrcSize->flags() ^ Qt::ItemIsEditable);\r
iSrcSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
- ui->tableWidget->setItem(0, 0, iSrcSize);\r
+ ui->tableWidget->setItem(0, 1, iSrcSize);\r
\r
QTableWidgetItem *iTgtSize = new QTableWidgetItem(tr("%1 Bytes").arg(tgtInfo.size()));\r
iTgtSize->setFlags(iTgtSize->flags() ^ Qt::ItemIsEditable);\r
iTgtSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
- ui->tableWidget->setItem(1, 0, iTgtSize);\r
+ ui->tableWidget->setItem(1, 1, iTgtSize);\r
\r
QTableWidgetItem *iSrcDate = new QTableWidgetItem(srcInfo.lastModified().toString("yy/MM/dd hh:mm"));\r
iSrcDate->setFlags(iSrcDate->flags() ^ Qt::ItemIsEditable);\r
iSrcDate->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
- ui->tableWidget->setItem(0, 1, iSrcDate);\r
+ ui->tableWidget->setItem(0, 2, iSrcDate);\r
\r
QTableWidgetItem *iTgtDate = new QTableWidgetItem(tgtInfo.lastModified().toString("yy/MM/dd hh:mm"));\r
iTgtDate->setFlags(iTgtDate->flags() ^ Qt::ItemIsEditable);\r
iTgtDate->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
- ui->tableWidget->setItem(1, 1, iTgtDate);\r
+ ui->tableWidget->setItem(1, 2, iTgtDate);\r
}\r
\r
-int OverWriteDialog::copyMethod()\r
+QString OverWriteDialog::copyMethod() const\r
{\r
- if (ui->rbAppendNumber->isChecked()) {\r
- return OverWriteDialog::AppendNumber;\r
- }\r
- if (ui->rbOverWrite->isChecked()) {\r
- return OverWriteDialog::OverWrite;\r
- }\r
- if (ui->rbOverWriteIfNew->isChecked()) {\r
- return OverWriteDialog::OverWriteIfNew;\r
- }\r
- if (ui->rbRename->isChecked()) {\r
- return OverWriteDialog::Rename;\r
- }\r
- return OverWriteDialog::Skip;\r
+ return ui->method->checkedButton()->objectName();\r
}\r
\r
-bool OverWriteDialog::isSameMethodChecked()\r
+bool OverWriteDialog::isKeepSetting() const\r
{\r
- return ui->checkBox->isChecked();\r
+ return ui->keepSetting->isChecked();\r
}\r
\r
-const QString OverWriteDialog::alias()\r
+const QString OverWriteDialog::alias() const\r
{\r
return ui->lineEdit->text();\r
}\r
Q_OBJECT\r
\r
public:\r
- enum {\r
- Undefined = 0x00,\r
- OverWrite = 0x01,\r
- OverWriteIfNew = 0x02,\r
- AppendNumber = 0x04,\r
- Skip = 0x08,\r
- Rename = 0x10,\r
- };\r
-\r
explicit OverWriteDialog(QWidget *parent = 0);\r
~OverWriteDialog();\r
\r
- void setCopyMethod(int method);\r
- void setSameMethodChecked(bool checked);\r
+ void reset();\r
+\r
+ // setter\r
void setFileInfo(const QString srcPath, const QString tgtPath);\r
\r
- int copyMethod();\r
- bool isSameMethodChecked();\r
- const QString alias();\r
+ // getter\r
+ QString copyMethod() const;\r
+ bool isKeepSetting() const;\r
+ const QString alias() const;\r
\r
private slots:\r
void onRenameOrElse();\r
<number>2</number>\r
</property>\r
<property name="columnCount">\r
- <number>2</number>\r
+ <number>3</number>\r
</property>\r
<attribute name="horizontalHeaderHighlightSections">\r
<bool>false</bool>\r
</row>\r
<column>\r
<property name="text">\r
+ <string>ファイル名</string>\r
+ </property>\r
+ </column>\r
+ <column>\r
+ <property name="text">\r
<string>サイズ</string>\r
</property>\r
</column>\r
<property name="text">\r
<string>上書き</string>\r
</property>\r
+ <attribute name="buttonGroup">\r
+ <string notr="true">method</string>\r
+ </attribute>\r
</widget>\r
</item>\r
<item>\r
<property name="text">\r
<string>新しければ上書き</string>\r
</property>\r
+ <attribute name="buttonGroup">\r
+ <string notr="true">method</string>\r
+ </attribute>\r
</widget>\r
</item>\r
<item>\r
<property name="text">\r
<string>スキップ</string>\r
</property>\r
+ <attribute name="buttonGroup">\r
+ <string notr="true">method</string>\r
+ </attribute>\r
</widget>\r
</item>\r
<item>\r
<property name="text">\r
<string>ファイル名末尾に数字を付与</string>\r
</property>\r
+ <attribute name="buttonGroup">\r
+ <string notr="true">method</string>\r
+ </attribute>\r
</widget>\r
</item>\r
<item>\r
<property name="text">\r
<string>名前を変更</string>\r
</property>\r
+ <attribute name="buttonGroup">\r
+ <string notr="true">method</string>\r
+ </attribute>\r
</widget>\r
</item>\r
<item>\r
<item>\r
<layout class="QHBoxLayout" name="horizontalLayout_2">\r
<item>\r
- <widget class="QCheckBox" name="checkBox">\r
+ <widget class="QCheckBox" name="keepSetting">\r
<property name="focusPolicy">\r
<enum>Qt::StrongFocus</enum>\r
</property>\r
</hints>\r
</connection>\r
</connections>\r
+ <buttongroups>\r
+ <buttongroup name="method"/>\r
+ </buttongroups>\r
</ui>\r
}
radioBtn = findChild<QRadioButton*>(strValue);
if (radioBtn == NULL) {
- radioBtn = ui->owDefIfNew;
+ radioBtn = ui->rbOverWriteIfNew;
}
radioBtn->setChecked(true);
ui->moveAfterCreate->setChecked(settings.value(IniKey_MoveAfterCreateFolder).toBool());
<x>0</x>
<y>0</y>
<width>549</width>
- <height>478</height>
+ <height>524</height>
</rect>
</property>
<property name="sizePolicy">
</sizepolicy>
</property>
<property name="windowTitle">
- <string>Dialog</string>
+ <string>環境設定</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<enum>Qt::StrongFocus</enum>
</property>
<property name="currentIndex">
- <number>4</number>
+ <number>2</number>
</property>
<widget class="QWidget" name="tabBoot_Exit">
<attribute name="title">
<string>起動と終了</string>
</attribute>
- <layout class="QVBoxLayout" name="verticalLayout">
+ <layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
- <number>4</number>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
+ <number>-1</number>
</property>
<item>
- <widget class="QCheckBox" name="bootSize">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="text">
- <string>起動時のウィンドウサイズを指定する</string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
- <number>4</number>
+ <number>-1</number>
</property>
- <property name="sizeConstraint">
- <enum>QLayout::SetFixedSize</enum>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
<item>
- <widget class="QRadioButton" name="sizeAbsolute">
+ <widget class="QCheckBox" name="bootSize">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="text">
- <string>絶対指定</string>
+ <string>起動時のウィンドウサイズを指定する</string>
</property>
- <attribute name="buttonGroup">
- <string notr="true">sizeOptions</string>
- </attribute>
</widget>
</item>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>幅</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QSpinBox" name="absoluteWidth">
- <property name="maximum">
- <number>9999</number>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>px</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
+ <layout class="QHBoxLayout" name="horizontalLayout_9">
<property name="spacing">
- <number>4</number>
+ <number>-1</number>
</property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>高さ</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QSpinBox" name="absoluteHeight">
- <property name="maximum">
- <number>9999</number>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>px</string>
- </property>
- </widget>
- </item>
<item>
- <spacer name="horizontalSpacer_10">
+ <spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
<property name="sizeHint" stdset="0">
<size>
- <width>40</width>
+ <width>10</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
- </layout>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_6">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="sizeConstraint">
- <enum>QLayout::SetMinimumSize</enum>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QRadioButton" name="sizeRelative">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="text">
- <string>相対指定</string>
- </property>
- <attribute name="buttonGroup">
- <string notr="true">sizeOptions</string>
- </attribute>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_4">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>幅</string>
- </property>
- </widget>
- </item>
<item>
- <widget class="QSpinBox" name="relativeWidth">
- <property name="maximum">
- <number>100</number>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <property name="spacing">
+ <number>-1</number>
</property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>%</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_5">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>高さ</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QSpinBox" name="relativeHeight">
- <property name="maximum">
- <number>100</number>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_8">
- <property name="text">
- <string>%</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <spacer name="horizontalSpacer_8">
- <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>
- <layout class="QHBoxLayout" name="horizontalLayout_7">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="sizeConstraint">
- <enum>QLayout::SetMinimumSize</enum>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <spacer name="horizontalSpacer_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QRadioButton" name="sizeLast">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="text">
- <string>前回終了時のサイズ</string>
- </property>
- <attribute name="buttonGroup">
- <string notr="true">sizeOptions</string>
- </attribute>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QCheckBox" name="bootPos">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="text">
- <string>起動時のウィンドウ位置を指定する</string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_12">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="sizeConstraint">
- <enum>QLayout::SetFixedSize</enum>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <spacer name="horizontalSpacer_6">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QRadioButton" name="posAbsolute">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="text">
- <string>絶対指定</string>
- </property>
- <attribute name="buttonGroup">
- <string notr="true">posOptions</string>
- </attribute>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_13">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <widget class="QLabel" name="label_13">
- <property name="text">
- <string>X</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QSpinBox" name="absoluteLeft">
- <property name="maximum">
- <number>9999</number>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_14">
- <property name="text">
- <string>px</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_14">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <widget class="QLabel" name="label_15">
- <property name="text">
- <string>Y</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QSpinBox" name="absoluteTop">
- <property name="maximum">
- <number>9999</number>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_16">
- <property name="text">
- <string>px</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_11">
- <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>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_9">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="sizeConstraint">
- <enum>QLayout::SetMinimumSize</enum>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <spacer name="horizontalSpacer_5">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
+ <item row="0" column="0">
+ <widget class="QRadioButton" name="sizeAbsolute">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="text">
+ <string>絶対指定</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">sizeOptions</string>
+ </attribute>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>幅</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="absoluteWidth">
+ <property name="maximum">
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>px</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="2">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>高さ</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="absoluteHeight">
+ <property name="maximum">
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>px</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0">
+ <widget class="QRadioButton" name="sizeRelative">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="text">
+ <string>相対指定</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">sizeOptions</string>
+ </attribute>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>幅</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="relativeWidth">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_7">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="2">
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>高さ</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="relativeHeight">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_8">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QRadioButton" name="sizeLast">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="text">
+ <string>前回終了時のサイズ</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">sizeOptions</string>
+ </attribute>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <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>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout">
<item>
- <widget class="QRadioButton" name="posRelative">
+ <widget class="QCheckBox" name="bootPos">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="text">
- <string>相対指定</string>
+ <string>起動時のウィンドウ位置を指定する</string>
</property>
- <attribute name="buttonGroup">
- <string notr="true">posOptions</string>
- </attribute>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_10">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
<item>
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>X</string>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
</property>
- </widget>
- </item>
- <item>
- <widget class="QSpinBox" name="relativeLeft">
- <property name="maximum">
- <number>100</number>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
</property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_10">
- <property name="text">
- <string>%</string>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
</property>
- </widget>
+ </spacer>
</item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_11">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
<item>
- <widget class="QLabel" name="label_11">
- <property name="text">
- <string>Y</string>
- </property>
- </widget>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QRadioButton" name="posAbsolute">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="text">
+ <string>絶対指定</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">posOptions</string>
+ </attribute>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
+ <item>
+ <widget class="QLabel" name="label_13">
+ <property name="text">
+ <string>X</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="absoluteLeft">
+ <property name="maximum">
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_14">
+ <property name="text">
+ <string>px</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="2">
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <item>
+ <widget class="QLabel" name="label_15">
+ <property name="text">
+ <string>Y</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="absoluteTop">
+ <property name="maximum">
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_16">
+ <property name="text">
+ <string>px</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0">
+ <widget class="QRadioButton" name="posRelative">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="text">
+ <string>相対指定</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">posOptions</string>
+ </attribute>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_8">
+ <item>
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>X</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="relativeLeft">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_10">
+ <property name="text">
+ <string>%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="2">
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
+ <item>
+ <widget class="QLabel" name="label_11">
+ <property name="text">
+ <string>Y</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="relativeTop">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_12">
+ <property name="text">
+ <string>%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0">
+ <widget class="QRadioButton" name="posCenter">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="text">
+ <string>画面中央</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">posOptions</string>
+ </attribute>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2">
+ <widget class="QRadioButton" name="posLast">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="text">
+ <string>前回終了時の位置</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">posOptions</string>
+ </attribute>
+ </widget>
+ </item>
+ </layout>
</item>
<item>
- <widget class="QSpinBox" name="relativeTop">
- <property name="maximum">
- <number>100</number>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
</property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_12">
- <property name="text">
- <string>%</string>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
</property>
- </widget>
+ </spacer>
</item>
</layout>
</item>
- <item>
- <spacer name="horizontalSpacer_9">
- <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>
- <layout class="QHBoxLayout" name="horizontalLayout_15">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="sizeConstraint">
- <enum>QLayout::SetMinimumSize</enum>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <spacer name="horizontalSpacer_7">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QRadioButton" name="posCenter">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="text">
- <string>画面中央</string>
- </property>
- <attribute name="buttonGroup">
- <string notr="true">posOptions</string>
- </attribute>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_8">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="sizeConstraint">
- <enum>QLayout::SetMinimumSize</enum>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>4</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <spacer name="horizontalSpacer_4">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QRadioButton" name="posLast">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="text">
- <string>前回終了時の位置</string>
- </property>
- <attribute name="buttonGroup">
- <string notr="true">posOptions</string>
- </attribute>
- </widget>
- </item>
</layout>
</item>
<item>
<enum>Qt::StrongFocus</enum>
</property>
<property name="text">
- <string>起動時に最新バージョンをチェックする。</string>
+ <string>起動時に最新バージョンをチェックする</string>
</property>
</widget>
</item>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
- <height>1</height>
+ <height>45</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
- <widget class="QWidget" name="tab">
+ <widget class="QWidget" name="tabOperation">
<attribute name="title">
<string>ファイル操作</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_8">
<property name="spacing">
- <number>4</number>
+ <number>-1</number>
</property>
<property name="leftMargin">
<number>4</number>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_24">
<property name="spacing">
- <number>4</number>
+ <number>-1</number>
</property>
<property name="leftMargin">
<number>4</number>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_25">
<property name="spacing">
- <number>4</number>
+ <number>-1</number>
</property>
<property name="leftMargin">
<number>4</number>
<number>4</number>
</property>
<property name="spacing">
- <number>4</number>
+ <number>-1</number>
</property>
<item row="0" column="0">
- <widget class="QRadioButton" name="owDefOverWrite">
+ <widget class="QRadioButton" name="rbOverWrite">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
<item row="0" column="1">
- <widget class="QRadioButton" name="owDefIfNew">
+ <widget class="QRadioButton" name="rbOverWriteIfNew">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
<item row="0" column="2">
- <widget class="QRadioButton" name="owDefSkip">
+ <widget class="QRadioButton" name="rbSkip">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
- <widget class="QRadioButton" name="owDefAppendNumber">
+ <widget class="QRadioButton" name="rbAppendNumber">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
<item row="1" column="2">
- <widget class="QRadioButton" name="owDefRename">
+ <widget class="QRadioButton" name="rbRename">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</item>
</layout>
</widget>
- <widget class="QWidget" name="tab_2">
+ <widget class="QWidget" name="tabPath">
<attribute name="title">
<string>パス設定</string>
</attribute>
<zorder></zorder>
<zorder>optExplain</zorder>
</widget>
- <widget class="QWidget" name="tab_3">
+ <widget class="QWidget" name="tabTextViewer">
<attribute name="title">
<string>テキストビューア</string>
</attribute>
</layout>
</widget>
<tabstops>
- <tabstop>tabWidget</tabstop>
<tabstop>bootSize</tabstop>
<tabstop>sizeAbsolute</tabstop>
<tabstop>absoluteWidth</tabstop>
<tabstop>absoluteHeight</tabstop>
<tabstop>sizeRelative</tabstop>
<tabstop>relativeWidth</tabstop>
- <tabstop>relativeHeight</tabstop>
<tabstop>sizeLast</tabstop>
<tabstop>bootPos</tabstop>
<tabstop>posAbsolute</tabstop>
<tabstop>absoluteTop</tabstop>
<tabstop>posRelative</tabstop>
<tabstop>relativeLeft</tabstop>
- <tabstop>relativeTop</tabstop>
<tabstop>posCenter</tabstop>
<tabstop>posLast</tabstop>
<tabstop>resetOnBoot</tabstop>
<tabstop>autoCloseMove</tabstop>
<tabstop>autoCloseDelete</tabstop>
<tabstop>autoCloseRename</tabstop>
- <tabstop>owDefOverWrite</tabstop>
- <tabstop>owDefIfNew</tabstop>
- <tabstop>owDefSkip</tabstop>
- <tabstop>owDefAppendNumber</tabstop>
- <tabstop>owDefRename</tabstop>
+ <tabstop>rbOverWrite</tabstop>
+ <tabstop>rbOverWriteIfNew</tabstop>
+ <tabstop>rbSkip</tabstop>
+ <tabstop>rbAppendNumber</tabstop>
+ <tabstop>rbRename</tabstop>
<tabstop>moveAfterCreate</tabstop>
<tabstop>openAfterCreate</tabstop>
<tabstop>editorPath</tabstop>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
+ <x>254</x>
+ <y>473</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
+ <x>322</x>
+ <y>473</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
</connection>
</connections>
<buttongroups>
- <buttongroup name="overwriteOptions"/>
<buttongroup name="posOptions"/>
+ <buttongroup name="overwriteOptions"/>
<buttongroup name="sizeOptions"/>
</buttongroups>
</ui>
+#include "common.h"
+#include "mainwindow.h"
#include "searchbox.h"
+#include <QAction>
+#include <QDebug>
+#include <QKeyEvent>
+#include <QApplication>
+
SearchBox::SearchBox(QWidget *parent) :
QLineEdit(parent)
{
}
+
+void SearchBox::itemFound()
+{
+ QPalette palette = this->palette();
+ palette.setColor(QPalette::Text, Qt::black);
+ setPalette(palette);
+}
+
+void SearchBox::itemNotFound()
+{
+ QPalette palette = this->palette();
+ palette.setColor(QPalette::Text, Qt::red);
+ setPalette(palette);
+}
+
+void SearchBox::keyPressEvent(QKeyEvent *event)
+{
+#if 0
+ QString ksq = KeyEventToSequence(event);
+
+ if (ksq == "/") {
+ QAction *action = getMainWnd()->findChild<QAction*>("action_Search");
+ action->toggle();
+ event->accept();
+ return;
+ }
+
+ QString textBefore = text();
+ QLineEdit::keyPressEvent(event);
+
+
+ if (ksq == "Shift+Return"){
+ qDebug() << ksq;
+ emit getMainWnd()->findChild<QAction*>("action_SearchPrev")->triggered();
+ }
+ else if (ksq.indexOf("Return") != -1) {
+ qDebug() << ksq;
+ emit getMainWnd()->findChild<QAction*>("action_SearchNext")->triggered();
+ }
+ else if (textBefore != text()) {
+ emit searchItem(text());
+ }
+ else {
+ qDebug() << ksq;
+ }
+#endif
+
+ QLineEdit::keyPressEvent(event);
+
+}
explicit SearchBox(QWidget *parent = 0);
signals:
+ void searchItem(const QString &text);
+ void searchNext(const QString &text);
+ void searchPrev(const QString &next);
+
+private slots:
+ void itemFound();
+ void itemNotFound();
public slots:
+ // QWidget interface
+protected:
+ void keyPressEvent(QKeyEvent *event);
};
#endif // SEARCHBOX_H
#include <QTextCodec>
#include <QStatusBar>
+QString KeyEventToSequence(const QKeyEvent *event)
+{
+ QString modifier = QString::null;
+ if (event->modifiers() & Qt::ShiftModifier) { modifier += "Shift+"; }
+ if (event->modifiers() & Qt::ControlModifier) { modifier += "Ctrl+"; }
+ if (event->modifiers() & Qt::AltModifier) { modifier += "Alt+"; }
+ if (event->modifiers() & Qt::MetaModifier) { modifier += "Meta+"; }
+
+ QString key = QKeySequence(event->key()).toString();
+ return QKeySequence(modifier + key).toString();
+}
+
SimpleTextView::SimpleTextView(QWidget *parent) :
QPlainTextEdit(parent),
m_convEUC(NULL),
void SimpleTextView::keyPressEvent(QKeyEvent *event)
{
- QString modifier = QString::null;
- if (event->modifiers() & Qt::ShiftModifier) { modifier += "Shift+"; }
- if (event->modifiers() & Qt::ControlModifier) { modifier += "Ctrl+"; }
- if (event->modifiers() & Qt::AltModifier) { modifier += "Alt+"; }
- if (event->modifiers() & Qt::MetaModifier) { modifier += "Meta+"; }
-
- QString key = QKeySequence(event->key()).toString();
- QString ksq = QKeySequence(modifier + key).toString();
+ QString ksq = KeyEventToSequence(event);
if (ksq == "Return" || ksq == "Backspace" || ksq == "W") {
emit viewFinished(this);