Fix for bug #8939: Don't just close if the user enters a shortcut

that is already assigned.

From new contributor Roy Xia.
This commit is contained in:
Richard Heck 2014-03-15 15:36:55 -04:00
parent a818ed0aab
commit 717d19d3c3
2 changed files with 36 additions and 10 deletions

View File

@ -1907,6 +1907,14 @@ contributors = [
"3 March 2014", "3 March 2014",
u"Chinese (traditional) translations"), u"Chinese (traditional) translations"),
contributor(u"Roy Xia",
"royxia062 () gmail ! com",
"GPL",
"GPL Statement",
"m=139434481324689",
"9 March 2014",
u"Bugfixing"),
contributor(u"Yihui Xie", contributor(u"Yihui Xie",
"xie () yihui ! name", "xie () yihui ! name",
"GPL", "GPL",

View File

@ -3182,8 +3182,6 @@ void PrefShortcuts::shortcutOkPressed()
return; return;
} }
shortcut_->accept();
// check to see if there's been any change // check to see if there's been any change
FuncRequest oldBinding = system_bind_.getBinding(k); FuncRequest oldBinding = system_bind_.getBinding(k);
if (oldBinding.action() == LFUN_UNKNOWN_ACTION) if (oldBinding.action() == LFUN_UNKNOWN_ACTION)
@ -3192,20 +3190,40 @@ void PrefShortcuts::shortcutOkPressed()
// nothing has changed // nothing has changed
return; return;
// make sure this key isn't already bound---and, if so, not unbound // make sure this key isn't already bound---and, if so, prompt user
FuncCode const unbind = user_unbind_.getBinding(k).action(); FuncCode const unbind = user_unbind_.getBinding(k).action();
docstring const action_string = makeCmdString(oldBinding); docstring const action_string = makeCmdString(oldBinding);
if (oldBinding.action() > LFUN_NOACTION && unbind == LFUN_UNKNOWN_ACTION if (oldBinding.action() > LFUN_NOACTION && unbind == LFUN_UNKNOWN_ACTION
&& save_lfun_ != toqstr(action_string)) { && save_lfun_ != toqstr(action_string)) {
// FIXME Perhaps we should offer to over-write the old shortcut? docstring const new_action_string = makeCmdString(func);
// If so, we'll need to remove it from our list, etc. docstring const text = bformat(_("Shortcut `%1$s' is already bound to "
Alert::error(_("Failed to create shortcut"), "%2$s.\n"
bformat(_("Shortcut `%1$s' is already bound to:\n%2$s\n" "Are you sure you want to unbind the "
"You need to remove that binding before creating a new one."), "current shortcut and bind it to %3$s?"),
k.print(KeySequence::ForGui), action_string)); k.print(KeySequence::ForGui), action_string,
return; new_action_string);
int ret = Alert::prompt(_("Redefine shortcut?"),
text, 0, 1, _("&Redefine"), _("&Cancel"));
if (ret != 0)
return;
QString const sequence_text = toqstr(k.print(KeySequence::ForGui));
QList<QTreeWidgetItem*> items = shortcutsTW->findItems(sequence_text,
Qt::MatchFlags(Qt::MatchExactly | Qt::MatchRecursive), 1);
if (items.size() > 0) {
// should always happen
bool expanded = items[0]->parent()->isExpanded();
shortcutsTW->setCurrentItem(items[0]);
removeShortcut();
shortcutsTW->setCurrentItem(0);
// make sure user doesn't see tree expansion if
// old binding wasn't in an expanded tree
if (!expanded)
items[0]->parent()->setExpanded(false);
}
} }
shortcut_->accept();
if (!save_lfun_.isEmpty()) if (!save_lfun_.isEmpty())
// real modification of the lfun's shortcut, // real modification of the lfun's shortcut,
// so remove the previous one // so remove the previous one