-#-------------------------------------------------\r
-#\r
-# Project created by QtCreator 2014-08-14T11:25:36\r
-#\r
-#-------------------------------------------------\r
-\r
-QT += core gui\r
-\r
-greaterThan(QT_MAJOR_VERSION, 4): QT += widgets\r
-\r
-TARGET = Gefu\r
-TEMPLATE = app\r
-\r
-\r
-SOURCES += main.cpp\\r
- mainwindow.cpp \\r
- folderpanel.cpp \\r
- renamesingledialog.cpp \\r
- renamemultidialog.cpp \\r
- operationdialog.cpp \\r
- irenamedialog.cpp \\r
- iworker.cpp \\r
- renameworker.cpp \\r
- deleteworker.cpp \\r
- overwritedialog.cpp \\r
- copymoveworker.cpp \\r
- sortdialog.cpp \\r
- filetablemodel.cpp \\r
- filetableview.cpp\r
-\r
-HEADERS += mainwindow.h \\r
- folderpanel.h \\r
- singleton.hpp \\r
- renamesingledialog.h \\r
- renamemultidialog.h \\r
- operationdialog.h \\r
- common.h \\r
- irenamedialog.h \\r
- iworker.h \\r
- renameworker.h \\r
- deleteworker.h \\r
- overwritedialog.h \\r
- copymoveworker.h \\r
- sortdialog.h \\r
- filetablemodel.h \\r
- filetableview.h\r
-\r
-FORMS += mainwindow.ui \\r
- folderpanel.ui \\r
- renamesingledialog.ui \\r
- renamemultidialog.ui \\r
- operationdialog.ui \\r
- overwritedialog.ui \\r
- sortdialog.ui\r
-\r
-RESOURCES += \\r
- resource.qrc\r
-\r
-OTHER_FILES += \\r
- Gefu.rc \\r
- README.md\r
-\r
-mac {\r
- ICON = ./images/Gefu.icns\r
-}\r
-\r
-win32 {\r
- RC_FILE = Gefu.rc\r
-}\r
+#-------------------------------------------------
+#
+# Project created by QtCreator 2014-08-14T11:25:36
+#
+#-------------------------------------------------
+
+QT += core gui
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+TARGET = Gefu
+TEMPLATE = app
+
+
+SOURCES += main.cpp\
+ mainwindow.cpp \
+ folderpanel.cpp \
+ renamesingledialog.cpp \
+ renamemultidialog.cpp \
+ operationdialog.cpp \
+ irenamedialog.cpp \
+ iworker.cpp \
+ renameworker.cpp \
+ deleteworker.cpp \
+ overwritedialog.cpp \
+ copymoveworker.cpp \
+ sortdialog.cpp \
+ filetablemodel.cpp \
+ filetableview.cpp \
+ history.cpp \
+ historydialog.cpp
+
+HEADERS += mainwindow.h \
+ folderpanel.h \
+ singleton.hpp \
+ renamesingledialog.h \
+ renamemultidialog.h \
+ operationdialog.h \
+ common.h \
+ irenamedialog.h \
+ iworker.h \
+ renameworker.h \
+ deleteworker.h \
+ overwritedialog.h \
+ copymoveworker.h \
+ sortdialog.h \
+ filetablemodel.h \
+ filetableview.h \
+ history.h \
+ historydialog.h
+
+FORMS += mainwindow.ui \
+ folderpanel.ui \
+ renamesingledialog.ui \
+ renamemultidialog.ui \
+ operationdialog.ui \
+ overwritedialog.ui \
+ sortdialog.ui \
+ historydialog.ui
+
+RESOURCES += \
+ resource.qrc
+
+OTHER_FILES += \
+ Gefu.rc \
+ README.md
+
+mac {
+ ICON = ./images/Gefu.icns
+}
+
+win32 {
+ RC_FILE = Gefu.rc
+}
\r
#define IniKey_ShowHidden "Common/ShowHidden"\r
#define IniKey_ShowSystem "Common/ShowSystem"\r
+#define IniKey_WindowX "Window/X"\r
+#define IniKey_WindowY "Window/Y"\r
+#define IniKey_WindowCX "Window/CX"\r
+#define IniKey_WindowCY "Window/CY"\r
#define IniSec_Left "Left"\r
#define IniSec_Right "Right"\r
#define IniKey_Dir "dir"\r
qDebug() << "ファイルリストを取得できません";\r
qDebug() << path;\r
}\r
-#ifdef Q_OS_WIN32\r
- else if (!(filter() & QDir::System)){\r
+ else {\r
QFileInfoList::iterator it;\r
for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); ) {\r
- DWORD dwFlags = ::GetFileAttributes(\r
- it->absoluteFilePath().toStdWString().c_str());\r
- if (dwFlags != DWORD(-1) && it->fileName() != ".." &&\r
- ((dwFlags & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM))\r
- {\r
- qDebug() << it->fileName() << " is system file.";\r
+ if (QFileInfo(it->canonicalFilePath()).isRoot()) {\r
it = m_fileInfoList.erase(it);\r
+ continue;\r
}\r
- else {\r
- it++;\r
+#ifdef Q_OS_WIN32\r
+ if (!(filter() & QDir::System)){\r
+ DWORD dwFlags = ::GetFileAttributes(\r
+ it->absoluteFilePath().toStdWString().c_str());\r
+ if (dwFlags != DWORD(-1) && it->fileName() != ".." &&\r
+ ((dwFlags & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM))\r
+ {\r
+ qDebug() << it->fileName() << " is system file.";\r
+ it = m_fileInfoList.erase(it);\r
+ continue;\r
+ }\r
}\r
+#endif\r
+ it++;\r
}\r
}\r
-#endif\r
m_checkStates.resize(m_fileInfoList.size());\r
m_checkStates.fill(Qt::Unchecked);\r
\r
#include "deleteworker.h"\r
#include "filetablemodel.h"\r
#include "filetableview.h"\r
+#include "historydialog.h"\r
#include "mainwindow.h"\r
#include "operationdialog.h"\r
#include "overwritedialog.h"\r
#include <QSettings>\r
#include <QFileDialog>\r
#include <QKeyEvent>\r
+#include <QStatusBar>\r
\r
#define CHECK_FOCUS { \\r
if (!hasFocus()) { return; } \\r
getMainWnd()->findChild<QAction*>(#x), SIGNAL(toggled(bool))\r
\r
FileTableView::FileTableView(QWidget *parent) :\r
- QTableView(parent)\r
+ QTableView(parent),\r
+ m_side(),\r
+ m_history()\r
{\r
// シグナル/スロットを設定する\r
connect(MENU_TRRIGGERED(action_Open), this, SLOT(setPath()));\r
\r
connect(this, SIGNAL(doubleClicked(QModelIndex)),\r
this, SLOT(setRootIndex(QModelIndex)));\r
-\r
- connect(this, SIGNAL(indexChanged(QString)),\r
- getMainWnd(), SLOT(setStatusText(QString)));\r
}\r
\r
FileTableView::~FileTableView()\r
void FileTableView::setSide(const QString &side)\r
{\r
m_side = side;\r
+\r
+ // コンストラクタではステータスバーが生成されていないため\r
+ // このタイミングでconnectする\r
+ connect(this, SIGNAL(indexChanged(QString)),\r
+ getMainWnd()->statusBar(), SLOT(showMessage(QString)));\r
}\r
\r
-void FileTableView::setRootPath(const QString &path)\r
+void FileTableView::setRootPath(const QString &path, bool addHistory)\r
{\r
FileTableModel *m = static_cast<FileTableModel*>(model());\r
QFileInfo info(path);\r
m->setPath(info.absoluteFilePath());\r
setUpdatesEnabled(true);\r
\r
+ if (addHistory) {\r
+ m_history.add(info.absoluteFilePath());\r
+ }\r
+ updateMenu();\r
+\r
setCurrentIndex(m->index(0, 0));\r
}\r
}\r
return list;\r
}\r
\r
+void FileTableView::updateMenu()\r
+{\r
+ if (m_history.isEmpty()) {\r
+ getMainWnd()->findChild<QAction*>("move_Back")->setEnabled(false);\r
+ getMainWnd()->findChild<QAction*>("move_Forward")->setEnabled(false);\r
+\r
+ }\r
+ else {\r
+ getMainWnd()->findChild<QAction*>("move_Back")\r
+ ->setEnabled(!m_history.isBegin());\r
+ getMainWnd()->findChild<QAction*>("move_Forward")\r
+ ->setEnabled(!m_history.isEnd());\r
+ }\r
+}\r
+\r
void FileTableView::setPath()\r
{\r
CHECK_FOCUS;\r
\r
QModelIndex index = currentIndex();\r
\r
- qDebug() << "row = " << index.row();\r
- qDebug() << "rowCount = " << m->rowCount();\r
-\r
-\r
-\r
QFileInfo info = m->fileInfo(index);\r
if (info.fileName() != "..") {\r
if (m->checkState(index) == Qt::Checked) {\r
\r
FileTableModel *mOther = static_cast<FileTableModel*>(other->model());\r
\r
- setRootPath(mOther->absolutePath());\r
+ setRootPath(mOther->absolutePath(), true);\r
}\r
\r
void FileTableView::setPathToOther()\r
\r
FileTableModel *m = static_cast<FileTableModel*>(model());\r
\r
- other->setRootPath(m->absolutePath());\r
+ other->setRootPath(m->absolutePath(), true);\r
}\r
\r
void FileTableView::swapPath()\r
QString path = m->absolutePath();\r
QString pathOther = mOther->absolutePath();\r
\r
- setRootPath(pathOther);\r
- other->setRootPath(path);\r
+ setRootPath(pathOther, true);\r
+ other->setRootPath(path, true);\r
}\r
\r
void FileTableView::showHiddenFiles(bool show)\r
void FileTableView::back()\r
{\r
CHECK_FOCUS;\r
+\r
+ if (!m_history.isBegin()) {\r
+ const QString &path = m_history.back();\r
+ setRootPath(path, false);\r
+\r
+ updateMenu();\r
+ }\r
}\r
\r
void FileTableView::forward()\r
{\r
CHECK_FOCUS;\r
+\r
+ if (!m_history.isEnd()) {\r
+ const QString &path = m_history.forward();\r
+ setRootPath(path, false);\r
+\r
+ updateMenu();\r
+ }\r
}\r
\r
void FileTableView::showHidtory()\r
{\r
CHECK_FOCUS;\r
+\r
+ FileTableView *other = getMainWnd()->otherSideView(this);\r
+\r
+ HistoryDialog dlg(this);\r
+ if (side() == "Left") {\r
+ dlg.setDefaultLeft(true);\r
+ dlg.setHistory(&m_history, other->history());\r
+ }\r
+ else {\r
+ dlg.setDefaultLeft(false);\r
+ dlg.setHistory(other->history(), &m_history);\r
+ }\r
+\r
+ QSize szMainWnd = getMainWnd()->size();\r
+ QSize szDialog = dlg.size();\r
+ szDialog.setWidth(szMainWnd.width() * 0.8);\r
+ dlg.resize(szDialog);\r
+ if (dlg.exec() == QDialog::Accepted) {\r
+ if (side() == dlg.selectedSide()) {\r
+ m_history.setAt(dlg.selectedIndex());\r
+ setRootPath(m_history.current(), false);\r
+ }\r
+ else {\r
+ setRootPath(other->history()->at(dlg.selectedIndex()), true);\r
+ }\r
+ updateMenu();\r
+ qDebug() << dlg.selectedIndex();\r
+ }\r
}\r
\r
void FileTableView::jumpToHome()\r
{\r
CHECK_FOCUS;\r
\r
- setRootPath(QDir::homePath());\r
+ setRootPath(QDir::homePath(), true);\r
}\r
\r
void FileTableView::jumpToParent()\r
QDir dir(m->absolutePath());\r
dir.cdUp();\r
\r
- setRootPath(dir.absolutePath());\r
+ setRootPath(dir.absolutePath(), true);\r
}\r
\r
void FileTableView::jumpToRoot()\r
{\r
CHECK_FOCUS;\r
\r
- setRootPath(QDir::rootPath());\r
+ setRootPath(QDir::rootPath(), true);\r
}\r
\r
void FileTableView::jumpTo()\r
QString path = QFileDialog::getExistingDirectory(\r
this, tr("フォルダを選択"), m->absolutePath());\r
if (!path.isEmpty()) {\r
- setRootPath(path);\r
+ setRootPath(path, true);\r
}\r
}\r
\r
FileTableModel *m = static_cast<FileTableModel*>(model());\r
\r
if (m->isDir(index)) {\r
- setRootPath(m->absoluteFilePath(index));\r
+ setRootPath(m->absoluteFilePath(index), true);\r
}\r
}\r
\r
QTableView::keyPressEvent(event);\r
}\r
\r
+void FileTableView::focusInEvent(QFocusEvent *event)\r
+{\r
+ updateMenu();\r
+\r
+ QTableView::focusInEvent(event);\r
+}\r
+\r
void FileTableView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)\r
{\r
Q_UNUSED(previous);\r
const FileTableModel *m = static_cast<const FileTableModel*>(current.model());\r
emit indexChanged(m->fileInfo(current).absoluteFilePath());\r
}\r
+\r
+\r
#ifndef FILETABLEVIEW_H\r
#define FILETABLEVIEW_H\r
\r
+#include "history.h"\r
+\r
#include <QFileInfoList>\r
#include <QTableView>\r
\r
\r
QString side() const;\r
void setSide(const QString &side);\r
- void setRootPath(const QString &path);\r
+\r
+ History* history() { return &m_history; }\r
+\r
+ void setRootPath(const QString &path, bool addHistory);\r
\r
private:\r
QString m_side;\r
+ History m_history;\r
\r
QFileInfoList selectedItems() const;\r
+ void updateMenu();\r
\r
signals:\r
void indexChanged(const QString &text);\r
// QWidget interface\r
protected:\r
void keyPressEvent(QKeyEvent *event);\r
+ void focusInEvent(QFocusEvent *event);\r
\r
// QAbstractItemView interface\r
protected slots:\r
header->setSectionResizeMode(1, QHeaderView::Stretch);\r
header->setSectionResizeMode(2, QHeaderView::ResizeToContents);\r
header->setSectionResizeMode(3, QHeaderView::ResizeToContents);\r
-\r
header->setDefaultSectionSize(header->minimumSectionSize());\r
+\r
+ QHeaderView *vHeader = ui->fileTable->verticalHeader();\r
+ vHeader->setDefaultSectionSize(vHeader->minimumSectionSize());\r
}\r
\r
FolderPanel::~FolderPanel()\r
//>>>>> 監視フォルダ初期化\r
QString key = side + slash + IniKey_Dir;\r
QString path = settings.value(key, QDir::homePath()).toString();\r
- model->setPath(path);\r
\r
ui->fileTable->setModel(model);\r
+ ui->fileTable->setRootPath(path, true);\r
ui->fileTable->selectRow(0);\r
- ui->fileTable->resizeColumnsToContents();\r
- ui->fileTable->resizeRowsToContents();\r
}\r
\r
void FolderPanel::onStateChanged(int checkedFolders, int checkedFiles, quint64 totalSize)\r
ui->locationField->blockSignals(true);\r
\r
QString path = ui->locationField->text();\r
- ui->fileTable->setRootPath(path);\r
+ ui->fileTable->setRootPath(path, true);\r
\r
ui->locationField->blockSignals(false);\r
}\r
--- /dev/null
+#include "history.h"
+
+History::History() :
+ m_list(),
+ m_pos(0)
+{
+}
+
+void History::add(const QString &path)
+{
+ // 現在位置より後ろのデータは削除する
+ if (!isEmpty() && !isEnd()) {
+ m_list.resize(m_pos + 1);
+ }
+ // 現在位置と異なるパスであれば追加する
+ if (isEmpty() || (m_list[m_pos] != path)) {
+ m_list.push_back(path);
+ }
+ m_pos = m_list.size() - 1;
+}
+
+const QString &History::back()
+{
+ if (!isBegin()) {
+ m_pos--;
+ }
+ return m_list[m_pos];
+}
+
+const QString &History::forward()
+{
+ if (!isEnd()) {
+ m_pos++;
+ }
+ return m_list[m_pos];
+}
--- /dev/null
+#include <QStringList>
+
+#ifndef HISTORY_H
+#define HISTORY_H
+
+#include <QVector>
+
+class History
+{
+ typedef QVector<QString> Container;
+
+public:
+ History();
+
+ void add(const QString &path);
+
+ const QString& back();
+ const QString& forward();
+ const QString& current() const { return m_list[m_pos]; }
+
+ bool isBegin() const { return m_pos == 0; }
+ bool isEnd() const { return m_pos == m_list.size() - 1; }
+ bool isEmpty() const { return m_list.isEmpty(); }
+
+ int size() const { return m_list.size(); }
+ const QString& at(int n) const { return m_list.at(n); }
+ void setAt(int n) { m_pos = n; }
+
+private:
+ Container m_list;
+ int m_pos;
+};
+
+#endif // HISTORY_H
--- /dev/null
+#include "historydialog.h"
+#include "ui_historydialog.h"
+
+HistoryDialog::HistoryDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::HistoryDialog),
+ m_leftHistory(NULL),
+ m_rightHistory(NULL),
+ m_displaying(NULL)
+{
+ ui->setupUi(this);
+
+}
+
+HistoryDialog::~HistoryDialog()
+{
+ delete ui;
+}
+
+void HistoryDialog::setHistory(History *left, History *right)
+{
+ m_leftHistory = left;
+ m_rightHistory = right;
+}
+
+void HistoryDialog::setDefaultLeft(bool bLeft)
+{
+ if (bLeft) {
+ ui->leftPane->setChecked(true);
+ }
+ else {
+ ui->rightPane->setChecked(true);
+ }
+}
+
+int HistoryDialog::selectedIndex() const
+{
+ int row = ui->listWidget->currentIndex().row();
+ return m_displaying->size() - row - 1;
+}
+
+const QString HistoryDialog::selectedSide() const
+{
+ if (ui->leftPane->isChecked()) {
+ return QString("Left");
+ }
+ else {
+ return QString("Right");
+ }
+}
+
+void HistoryDialog::showLeftHistory()
+{
+ if (m_displaying != m_leftHistory) {
+ m_displaying = m_leftHistory;
+ showHistory();
+ }
+
+}
+
+void HistoryDialog::showRightHistory()
+{
+ if (m_displaying != m_rightHistory) {
+ m_displaying = m_rightHistory;
+ showHistory();
+ }
+}
+
+void HistoryDialog::showHistory()
+{
+ ui->listWidget->clear();
+ for (int n = 0; n < m_displaying->size(); n++) {
+ ui->listWidget->insertItem(0, m_displaying->at(n));
+ }
+ ui->listWidget->setCurrentRow(0);
+}
+
+void HistoryDialog::showEvent(QShowEvent *event)
+{
+ Q_UNUSED(event);
+
+ if (ui->leftPane->isChecked()) {
+ showLeftHistory();
+ }
+ else {
+ showRightHistory();
+ }
+
+ connect(ui->leftPane, SIGNAL(clicked()), this, SLOT(showLeftHistory()));
+ connect(ui->rightPane, SIGNAL(clicked()), this, SLOT(showRightHistory()));
+ connect(ui->listWidget, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(accept()));
+}
--- /dev/null
+#ifndef HISTORYDIALOG_H
+#define HISTORYDIALOG_H
+
+#include "history.h"
+
+#include <QDialog>
+
+namespace Ui {
+class HistoryDialog;
+}
+
+class HistoryDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit HistoryDialog(QWidget *parent = 0);
+ ~HistoryDialog();
+
+ void setHistory(History *left, History *right);
+ void setDefaultLeft(bool bLeft);
+
+ int selectedIndex() const;
+ const QString selectedSide() const;
+
+private:
+ Ui::HistoryDialog *ui;
+ History *m_leftHistory;
+ History *m_rightHistory;
+ History *m_displaying;
+
+private slots:
+ void showLeftHistory();
+ void showRightHistory();
+ void showHistory();
+
+ // QWidget interface
+protected:
+ void showEvent(QShowEvent *event);
+};
+
+#endif // HISTORYDIALOG_H
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>HistoryDialog</class>
+ <widget class="QDialog" name="HistoryDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>280</width>
+ <height>286</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>履歴を選択</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QRadioButton" name="leftPane">
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
+ <property name="text">
+ <string>左ペイン</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">buttonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="rightPane">
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
+ <property name="text">
+ <string>右ペイン</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">buttonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QListWidget" name="listWidget">
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>listWidget</tabstop>
+ <tabstop>leftPane</tabstop>
+ <tabstop>rightPane</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>HistoryDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>HistoryDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+ <buttongroups>
+ <buttongroup name="buttonGroup"/>
+ </buttongroups>
+</ui>
\r
MainWindow::~MainWindow()\r
{\r
- delete ui;\r
-}\r
\r
-void MainWindow::setStatusText(const QString &str)\r
-{\r
- ui->statusBar->showMessage(str);\r
+ delete ui;\r
}\r
\r
FileTableView *MainWindow::otherSideView(const FileTableView *view) const\r
void showSystemFiles(bool show);\r
\r
public slots:\r
- void setStatusText(const QString &str);\r
void onActionSetting();\r
void onHelpAbout();\r
\r
<x>0</x>\r
<y>0</y>\r
<width>662</width>\r
- <height>24</height>\r
+ <height>22</height>\r
</rect>\r
</property>\r
<widget class="QMenu" name="menu_File">\r
<string>戻る</string>\r
</property>\r
<property name="shortcut">\r
- <string>Alt+Left</string>\r
+ <string>[</string>\r
</property>\r
</action>\r
<action name="move_Forward">\r
<string>進む</string>\r
</property>\r
<property name="shortcut">\r
- <string>Alt+Right</string>\r
+ <string>]</string>\r
</property>\r
</action>\r
<action name="move_History">\r