mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-09-27 20:44:13 +02:00
05260de87b
Add pinned elements to the shortcut bar, with a width you can set
209 lines
6.0 KiB
C++
209 lines
6.0 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>
|
|
|
|
#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 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;
|
|
}
|
|
|
|
/**
|
|
@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);
|
|
}
|