mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-09-28 04:54:13 +02:00
47e5a8072b
After customising, the bar now opens at the cursor like every other time, instead of where the customising window was. A size grip in the bar's corner sets its width. The tiles are laid out in rows that wrap at that width, so a bar with many commands and pinned elements becomes a block rather than one long strip; the height follows the rows, and the width is saved. Until the user sets one, the tiles stay on one row, as before. The grip is driven by hand: QSizeGrip asks the window manager to resize, and on X11 a popup is not managed, so nothing would happen. The hint line wraps rather than being cut off at narrow widths. The customising window remembers the size it was left at. Discussion #1033. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
191 lines
5.5 KiB
C++
191 lines
5.5 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 "shortcutmanager.h"
|
|
|
|
#include <QCoreApplication>
|
|
#include <QSettings>
|
|
|
|
#include <algorithm>
|
|
|
|
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 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;
|
|
}
|
|
|
|
/**
|
|
@return true if @a id is a pinned element's collection path rather than
|
|
a command id. Command ids never contain "://".
|
|
*/
|
|
bool ShortcutBarSettings::isElement(const QString &id)
|
|
{
|
|
return id.contains(QLatin1String("://"));
|
|
}
|
|
|
|
/**
|
|
@return true if the row for @a context holds at least one element
|
|
*/
|
|
bool ShortcutBarSettings::hasElements(Context context)
|
|
{
|
|
const QStringList list = ids(context);
|
|
return std::any_of(list.cbegin(), list.cend(), &ShortcutBarSettings::isElement);
|
|
}
|
|
|
|
/**
|
|
@return the width the user gave the bar with its size grip, or 0 when
|
|
they never did: the tiles then stay on one row
|
|
*/
|
|
int ShortcutBarSettings::barWidth()
|
|
{
|
|
return QSettings().value(QStringLiteral("diagrameditor/shortcut_bar/width"), 0).toInt();
|
|
}
|
|
|
|
void ShortcutBarSettings::setBarWidth(int width)
|
|
{
|
|
QSettings().setValue(QStringLiteral("diagrameditor/shortcut_bar/width"), width);
|
|
}
|
|
|
|
/**
|
|
@return the size the user left the customising window at, or an invalid
|
|
size when it was never opened
|
|
*/
|
|
QSize ShortcutBarSettings::editorSize()
|
|
{
|
|
return QSettings().value(QStringLiteral("diagrameditor/shortcut_bar/editor_size")).toSize();
|
|
}
|
|
|
|
void ShortcutBarSettings::setEditorSize(const QSize &size)
|
|
{
|
|
QSettings().setValue(QStringLiteral("diagrameditor/shortcut_bar/editor_size"), size);
|
|
}
|