Files
qelectrotech-source-mirror/sources/shortcutbarsettings.cpp
T
ispyisail b80d6e7cd3 Show the selection's commands beside the cursor after a click
After a click that selects something on a folio, a small row of commands
appears just above and to the right of the cursor, as the SolidWorks
context toolbar does. It fades as the mouse moves away and is gone past
200 pixels; a click elsewhere, the wheel, a key press or an emptied
selection hide it too. Clicking a command leaves it up, so rotate can be
clicked again.

The commands are the shortcut bar's for that selection -- elements or
conductors -- at most eight, so customising the bar customises this as
well. It is a child of the view's viewport, never a window, and never
takes the focus.

It is not shown after a drag (moving items, a rubber band), while
placing or drawing (Diagram::eventInterfaceIsRunning()), on
a read-only folio, or when switched off with the new General option
"Afficher les commandes près de la sélection" (diagrameditor/
context_toolbar, on by default).

ShortcutBarSettings::contextFor() now decides the context for both the
bar and this toolbar.

Discussion #1033.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G2d2Zi8BfrYRPX88zhaoFG
(cherry picked from commit 78f3c1a2bc5c3cf1f7beae4bd60aefec20847d6d)
2026-09-26 21:40:32 +12:00

161 lines
4.7 KiB
C++

/*
Copyright 2006-2026 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#include "shortcutbarsettings.h"
#include "qetgraphicsitem/conductor.h"
#include "shortcutmanager.h"
#include <QCoreApplication>
#include <algorithm>
#include <QSettings>
namespace {
QString settingsKey(ShortcutBarSettings::Context context)
{
switch (context)
{
case ShortcutBarSettings::Canvas:
return QStringLiteral("diagrameditor/shortcut_bar/canvas");
case ShortcutBarSettings::Selection:
return QStringLiteral("diagrameditor/shortcut_bar/selection");
case ShortcutBarSettings::Conductor:
return QStringLiteral("diagrameditor/shortcut_bar/conductor");
}
return QString();
}
}
/**
@return every context, in the order they are shown to the user
*/
QList<ShortcutBarSettings::Context> ShortcutBarSettings::contexts()
{
return {Canvas, Selection, Conductor};
}
/**
@return the context for @a selection: Canvas when empty, Conductor when
it holds only conductors, Selection otherwise
*/
ShortcutBarSettings::Context ShortcutBarSettings::contextFor(
const QList<QGraphicsItem *> &selection)
{
if (selection.isEmpty()) {
return Canvas;
}
const bool only_conductors = std::all_of(
selection.cbegin(), selection.cend(),
[](QGraphicsItem *item) { return item->type() == Conductor::Type; });
return only_conductors ? Conductor : Selection;
}
/**
@return the name of @a context, for the configuration page
*/
QString ShortcutBarSettings::title(Context context)
{
switch (context)
{
case Canvas:
return QCoreApplication::translate("ShortcutBarSettings", "Folio, rien de sélectionné");
case Selection:
return QCoreApplication::translate("ShortcutBarSettings", "Éléments sélectionnés");
case Conductor:
return QCoreApplication::translate("ShortcutBarSettings", "Conducteurs sélectionnés");
}
return QString();
}
/**
@return the ids to show for @a context: the user's list if they saved
one, the defaults otherwise. A saved empty list stays empty.
*/
QStringList ShortcutBarSettings::ids(Context context)
{
QSettings settings;
const QString key = settingsKey(context);
if (!settings.contains(key)) {
return defaultIds(context);
}
return settings.value(key).toStringList();
}
/**
@return the commands a new user sees for @a context
*/
QStringList ShortcutBarSettings::defaultIds(Context context)
{
switch (context)
{
case Canvas:
return {QStringLiteral("diagrameditor.insert_last_element"),
QStringLiteral("diagrameditor.show_element_picker"),
QStringLiteral("diagrameditor.add_text"),
QStringLiteral("diagrameditor.add_line"),
QStringLiteral("diagrameditor.add_rectangle"),
QStringLiteral("diagrameditor.add_terminal_strip"),
QStringLiteral("diagrameditor.paste"),
QStringLiteral("diagrameditor.edit_diagram_properties")};
case Selection:
return {QStringLiteral("diagrameditor.rotate_selection"),
QStringLiteral("diagrameditor.rotate_texts"),
QStringLiteral("diagrameditor.edit_selection"),
QStringLiteral("diagrameditor.copy"),
QStringLiteral("diagrameditor.cut"),
QStringLiteral("diagrameditor.delete_selection")};
case Conductor:
return {QStringLiteral("diagrameditor.conductor_reset"),
QStringLiteral("diagrameditor.edit_selection"),
QStringLiteral("diagrameditor.delete_selection")};
}
return {};
}
/**
@brief ShortcutBarSettings::setIds
Save @a ids for @a context. Saving the defaults removes the key, so a
later change of defaults still reaches this user.
*/
void ShortcutBarSettings::setIds(Context context, const QStringList &ids)
{
QSettings settings;
if (ids == defaultIds(context)) {
settings.remove(settingsKey(context));
} else {
settings.setValue(settingsKey(context), ids);
}
}
/**
@return every command that can go on the bar: those the diagram editor
registered with ShortcutManager, except the one that opens the bar.
*/
QStringList ShortcutBarSettings::availableIds()
{
QStringList ids;
for (const ShortcutManager::ShortcutInfo &info :
ShortcutManager::instance().allShortcuts())
{
if (info.id.startsWith(QLatin1String("diagrameditor."))
&& info.id != QLatin1String("diagrameditor.show_shortcut_bar")) {
ids << info.id;
}
}
return ids;
}