Merge pull request #5633 from Marr11317/metaedit

Add support for deleting (custom) metatags.
This commit is contained in:
anatoly-os 2020-04-15 00:10:59 +03:00 committed by GitHub
commit ef8b8a05ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 450 additions and 142 deletions

32
mscore/data/icons/bin.svg Normal file
View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<!-- Généré par Microsoft Visio 11.0, SVG Export, v1.0 bin.svg Capa_1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="8.5in" height="11in" viewBox="0 0 612 792"
xml:space="preserve" color-interpolation-filters="sRGB" class="st2">
<v:documentProperties v:langID="1033" v:metric="true" v:viewMarkup="false"/>
<style type="text/css">
<![CDATA[
.st1 {fill:#3b3f45;stroke:none;stroke-linecap:butt;stroke-width:1.59375}
.st2 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
]]>
</style>
<g v:mID="0" v:index="1" v:groupContext="foregroundPage">
<title>Capa_1</title>
<v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="19" v:shadowOffsetX="9" v:shadowOffsetY="-9"/>
<g id="group1-1" transform="translate(68.0005,-90)" v:mID="1" v:groupContext="group">
<title>Feuille.1</title>
<g id="shape2-2" v:mID="2" v:groupContext="shape" transform="translate(33.9995,-3.06954E-012)">
<title>Feuille.2</title>
<path d="M0 724 C-0 761.57 30.43 792 68 792 L340 792 C377.57 792 408 761.57 408 724 L408 316 L0 316 L0 724 Z"
class="st1"/>
</g>
<g id="shape3-4" v:mID="3" v:groupContext="shape" transform="translate(0,-510)">
<title>Feuille.3</title>
<path d="M357 724 L323 690 L153 690 L119 724 L0 724 L0 792 L476 792 L476 724 L357 724 Z" class="st1"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -159,6 +159,7 @@ static const char* iconNames[] = {
"arrow_down.svg",
"mail.svg",
"bug.svg",
"bin.svg",
"note_timewise.svg",
"arrowsMoveToTop.svg"
};

View file

@ -24,7 +24,7 @@ namespace Ms {
extern void genIcons();
enum class Icons : signed char { Invalid_ICON = -1,
enum class Icons : signed int { Invalid_ICON = -1,
longaUp_ICON, brevis_ICON, note_ICON, note2_ICON, note4_ICON, note8_ICON, note16_ICON,
note32_ICON, note64_ICON, note128_ICON,
natural_ICON, sharp_ICON, sharpsharp_ICON, flat_ICON, flatflat_ICON,
@ -52,13 +52,12 @@ enum class Icons : signed char { Invalid_ICON = -1,
vframe_ICON, hframe_ICON, tframe_ICON, fframe_ICON, measure_ICON, checkmark_ICON,
mscz_ICON,
helpContents_ICON, goHome_ICON, goPrevious_ICON, goNext_ICON, viewRefresh_ICON,
parentheses_ICON,
brackets_ICON,
parentheses_ICON, brackets_ICON,
timesig_allabreve_ICON, timesig_common_ICON, timesig_prolatio01_ICON, timesig_prolatio02_ICON,
timesig_prolatio03_ICON, timesig_prolatio04_ICON, timesig_prolatio05_ICON, timesig_prolatio07_ICON,
timesig_prolatio08_ICON, timesig_prolatio10_ICON, timesig_prolatio11_ICON, edit_ICON, reset_ICON, close_ICON,
arrowUp_ICON, arrowDown_ICON,
mail_ICON, bug_ICON,
mail_ICON, bug_ICON, bin_ICON,
noteTimewise_ICON,
arrowsMoveToTop_ICON,
voice1_ICON, voice2_ICON, voice3_ICON, voice4_ICON,

View file

@ -21,6 +21,8 @@
#include "libmscore/score.h"
#include "libmscore/undo.h"
#include "musescore.h"
#include "preferences.h"
#include "icons.h"
namespace Ms {
@ -28,18 +30,21 @@ namespace Ms {
// MetaEditDialog
//---------------------------------------------------------
MetaEditDialog::MetaEditDialog(Score* s, QWidget* parent)
: QDialog(parent)
MetaEditDialog::MetaEditDialog(Score* score, QWidget* parent)
: QDialog(parent),
m_score(score),
m_dirty(false)
{
setObjectName("MetaEditDialog");
setupUi(this);
setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
score = s;
dirty = false;
level->setValue(score->mscVersion());
version->setText(score->mscoreVersion());
int rev = score->mscoreRevision();
setupUi(this);
QDialog::setWindowFlag(Qt::WindowContextHelpButtonHint, false);
QDialog::setWindowFlag(Qt::WindowMinMaxButtonsHint);
version->setText(m_score->mscoreVersion());
level->setText(QString::number(m_score->mscVersion()));
int rev = m_score->mscoreRevision();
if (rev > 99999) // MuseScore 1.3 is decimal 5702, 2.0 and later uses a 7-digit hex SHA
revision->setText(QString::number(rev, 16));
else
@ -55,78 +60,209 @@ MetaEditDialog::MetaEditDialog(Score* s, QWidget* parent)
tr("initially read from:"), previousFileName));
filePath->setTextInteractionFlags(Qt::TextSelectableByMouse);
int idx = 0;
QMapIterator<QString, QString> i(s->metaTags());
QGridLayout* grid = static_cast<QGridLayout*>(scrollWidget->layout());
while (i.hasNext()) {
i.next();
QLabel* l = new QLabel;
l->setText(i.key());
QLineEdit* text = new QLineEdit(i.value(), 0);
connect(text, SIGNAL(textChanged(const QString&)), SLOT(setDirty()));
grid->addWidget(l, idx, 0);
grid->addWidget(text, idx, 1);
++idx;
QMapIterator<QString, QString> iterator(score->metaTags());
while (iterator.hasNext()) {
iterator.next();
const QString key = iterator.key();
addTag(key, iterator.value(), isBuiltinTag(key));
}
connect(newButton, SIGNAL(clicked()), SLOT(newClicked()));
scrollAreaLayout->setColumnStretch(1, 1); // The 'value' column should be expanding
connect(newButton, &QPushButton::clicked, this, [this]() { newClicked(); });
connect(saveButton, &QPushButton::clicked, this, &MetaEditDialog::save);
MuseScore::restoreGeometry(this);
}
//---------------------------------------------------------
// newClicked
// addTag
/// Add a tag to the displayed list
/// returns a pair of widget corresponding to the key and value:
/// QPair<QLineEdit* key, QLineEdit* value>
//---------------------------------------------------------
void MetaEditDialog::newClicked()
{
QString s = QInputDialog::getText(this,
tr("Input Tag Name"),
tr("New tag name:")
);
QGridLayout* grid = static_cast<QGridLayout*>(scrollWidget->layout());
if (!s.isEmpty()) {
int idx = grid->rowCount();
QLabel* l = new QLabel;
l->setText(s);
QLineEdit* text = new QLineEdit;
grid->addWidget(l, idx, 0);
grid->addWidget(text, idx, 1);
QPair<QLineEdit*, QLineEdit*> MetaEditDialog::addTag(const QString& key, const QString& value, const bool builtinTag)
{
QLineEdit* tagWidget = new QLineEdit(key);
QLineEdit* valueWidget = new QLineEdit(value);
connect(valueWidget, &QLineEdit::textChanged, this, [this]() { setDirty(); });
const int numFlags = scrollAreaLayout->rowCount();
if (builtinTag) {
tagWidget->setReadOnly(true);
// Make it clear that builtin tags are not editable
tagWidget->setStyleSheet("QLineEdit { background: transparent; }");
tagWidget->setFrame(false);
tagWidget->setFocusPolicy(Qt::NoFocus);
tagWidget->setToolTip(tr("This is a builtin tag. Its name cannot be modified."));
}
dirty = true;
else {
tagWidget->setPlaceholderText(tr("Name"));
QToolButton* deleteButton = new QToolButton();
deleteButton->setIcon(*icons[int (Icons::bin_ICON)]);
// follow gui scaling. The '+ 2' at the end is the margin. (2 * 1px).for top and bottoms.
const double size = preferences.getInt(PREF_UI_THEME_ICONWIDTH) * guiScaling * .5 + 2;
deleteButton->setIconSize(QSize(size, size));
connect(tagWidget, &QLineEdit::textChanged, this, [this]() { setDirty(); });
connect(deleteButton, &QToolButton::clicked, this,
[this, tagWidget, valueWidget, deleteButton]() { setDirty();
tagWidget->deleteLater();
valueWidget->deleteLater();
deleteButton->deleteLater(); });
scrollAreaLayout->addWidget(deleteButton, numFlags, 2);
}
scrollAreaLayout->addWidget(tagWidget, numFlags, 0);
scrollAreaLayout->addWidget(valueWidget, numFlags, 1);
return QPair<QLineEdit*, QLineEdit*>(tagWidget, valueWidget);
}
//---------------------------------------------------------
// newClicked
/// When the 'New' button is clicked, a new tag is appended,
/// and focus is set to the QLineEdit corresponding to its name.
//---------------------------------------------------------
void MetaEditDialog::newClicked() {
QPair<QLineEdit*, QLineEdit*> pair = addTag("", "", false);
pair.first->setFocus();
pair.second->setPlaceholderText(tr("Value"));
// scroll down to see the newly created tag.
// ugly workaround because scrolling to maximum doesn't completely scroll
// to the maximum, for some unknow reason.
// See https://www.qtcentre.org/threads/32852-How-can-I-always-keep-the-scroll-bar-at-the-bottom-of-a-QScrollArea
QScrollBar* scrollBar = scrollArea->verticalScrollBar();
scrollBar->setMaximum(scrollBar->maximum() + 1);
scrollBar->setValue(scrollBar->maximum());
setDirty();
}
//---------------------------------------------------------
// isBuiltinTag
/// returns true if the tag is one of Musescore's builtin tags
/// see also MasterScore::MasterScore()
//---------------------------------------------------------
const bool MetaEditDialog::isBuiltinTag(const QString& tag) const {
return (tag == "platform" || tag == "movementNumber" || tag == "movementTitle"
|| tag == "workNumber" || tag == "workTitle" || tag == "arranger"
|| tag == "composer" || tag == "lyricist" || tag == "poet"
|| tag == "translator" || tag == "source" || tag == "copyright"
|| tag == "creationDate");
}
//---------------------------------------------------------
// setDirty
/// Sets the editor as having unsaved changes
//---------------------------------------------------------
void MetaEditDialog::setDirty(const bool dirty)
{
if (dirty == m_dirty)
return;
saveButton->setEnabled(dirty);
setWindowTitle(tr("Score properties: ") + m_score->title() + (dirty ? "*" : ""));
m_dirty = dirty;
}
//---------------------------------------------------------
// save
/// Save the currently displayed metatags
//---------------------------------------------------------
const bool MetaEditDialog::save()
{
if (m_dirty) {
const int idx = scrollAreaLayout->rowCount();
QMap<QString, QString> map;
for (int i = 0; i < idx; ++i) {
QLayoutItem *tagItem = scrollAreaLayout->itemAtPosition(i, 0);
QLayoutItem *valueItem = scrollAreaLayout->itemAtPosition(i, 1);
if (tagItem && valueItem) {
QLineEdit *tag = static_cast<QLineEdit*>(tagItem->widget());
QLineEdit *value = static_cast<QLineEdit*>(valueItem->widget());
QString tagText = tag->text();
if (tagText.isEmpty()) {
QMessageBox::warning(this, tr("MuseScore"),
tr("Tags can't have empty names."),
QMessageBox::Ok, QMessageBox::Ok);
tag->setFocus();
return false;
}
if (map.contains(tagText)) {
if (isBuiltinTag(tagText)) {
QMessageBox::warning(this, tr("MuseScore"),
tagText + tr(" is a reserved builtin tag.\n"
"It can't be used."),
QMessageBox::Ok, QMessageBox::Ok);
tag->setFocus();
return false;
}
QMessageBox::warning(this, tr("MuseScore"),
tr("You have multiple fields with the same name."),
QMessageBox::Ok, QMessageBox::Ok);
tag->setFocus();
return false;
}
map.insert(tagText, value->text());
}
else
qDebug("MetaEditDialog: abnormal configuration: %i", i);
}
m_score->undo(new ChangeMetaTags(m_score, map));
setDirty(false);
}
return true;
}
//---------------------------------------------------------
// accept
/// Reimplemented to save modifications before closing the dialog.
//---------------------------------------------------------
void MetaEditDialog::accept()
{
if (dirty) {
QGridLayout* grid = static_cast<QGridLayout*>(scrollWidget->layout());
int idx = grid->rowCount();
QMap<QString, QString> m;
for (int i = 0; i < idx; ++i) {
QLayoutItem* labelItem = grid->itemAtPosition(i, 0);
QLayoutItem* dataItem = grid->itemAtPosition(i, 1);
if (labelItem && dataItem) {
QLabel* l = static_cast<QLabel*>(labelItem->widget());
QLineEdit* le = static_cast<QLineEdit*>(dataItem->widget());
m.insert(l->text(), le->text());
}
}
score->undo(new ChangeMetaTags(score, m));
}
if (!save())
return;
QDialog::accept();
}
//---------------------------------------------------------
// hideEvent
/// Reimplemented to notify the user that he/she is quitting without saving
//---------------------------------------------------------
void MetaEditDialog::hideEvent(QHideEvent* event)
void MetaEditDialog::closeEvent(QCloseEvent* event)
{
if (m_dirty) {
QMessageBox::StandardButton button = QMessageBox::warning(this, tr("MuseScore"),
tr("You have unsaved changes.\nSave?"),
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,
QMessageBox::Save);
if (button == QMessageBox::Save) {
if (!save()) {
event->ignore();
return;
}
}
else if (button == QMessageBox::Cancel) {
event->ignore();
return;
}
}
MuseScore::saveGeometry(this);
QWidget::hideEvent(event);
event->accept();
}
}
} // namespace Ms

View file

@ -28,27 +28,33 @@ class Score;
//---------------------------------------------------------
// MetaEditDialog
/// Dialog for editing metatags.
/// NOTE: Right now, builtin metatags cannot be deleted by the user,
/// because they are automatically created when a MasterScore is instantiated.
/// This means that if they get deleted, they are simply readded (but empty)
/// when the score is reopened.
/// see also MasterScore::MasterScore()
//---------------------------------------------------------
class MetaEditDialog : public QDialog, public Ui::MetaEditDialog {
Q_OBJECT
Score* score;
Score* m_score; /// the current score
bool m_dirty; /// wheter the editor has unsaved changes or not
bool dirty;
virtual void closeEvent(QCloseEvent*) override;
virtual void hideEvent(QHideEvent*);
const bool isBuiltinTag(const QString& tag) const;
QPair<QLineEdit*, QLineEdit*> addTag(const QString& key, const QString& value, const bool builtinTag);
private slots:
const bool save();
void newClicked();
void setDirty() { dirty = true; }
public slots:
virtual void accept();
void setDirty(const bool dirty = true);
public:
MetaEditDialog(Score*, QWidget* parent = 0);
};
MetaEditDialog(Score* score, QWidget* parent = nullptr);
virtual void accept();
};
} // namespace Ms

View file

@ -6,10 +6,13 @@
<rect>
<x>0</x>
<y>0</y>
<width>668</width>
<height>373</height>
<width>682</width>
<height>406</height>
</rect>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="windowTitle">
<string>Score Properties</string>
</property>
@ -19,72 +22,154 @@
<property name="topMargin">
<number>0</number>
</property>
<item row="1" column="1">
<widget class="QLineEdit" name="version">
<property name="enabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>MuseScore Version:</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLineEdit" name="revision">
<property name="enabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Revision:</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QLabel" name="label_9">
<widget class="QLabel" name="labelLevel">
<property name="text">
<string>API-Level:</string>
</property>
<property name="textInteractionFlags">
<set>Qt::NoTextInteraction</set>
</property>
</widget>
</item>
<item row="0" column="1" colspan="6">
<widget class="QLabel" name="filePath">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Where this score is saved on your computer.</string>
</property>
<property name="accessibleDescription">
<string>Where this score is saved on your computer.</string>
</property>
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="text">
<string>The document has not been saved yet.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QSpinBox" name="level">
<property name="enabled">
<bool>false</bool>
<widget class="QLabel" name="level">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>true</bool>
<property name="minimumSize">
<size>
<width>51</width>
<height>0</height>
</size>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
<property name="toolTip">
<string>API-Level</string>
</property>
<property name="maximum">
<number>99999</number>
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="text">
<string>No level</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="version">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>The MuseScore version with which this score was last saved.</string>
</property>
<property name="accessibleDescription">
<string>The MuseScore version with which this score was last saved.</string>
</property>
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="text">
<string>No version</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="labelRevision">
<property name="text">
<string>Revision:</string>
</property>
<property name="textInteractionFlags">
<set>Qt::NoTextInteraction</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelVersion">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="text">
<string>MuseScore Version:</string>
</property>
<property name="textInteractionFlags">
<set>Qt::NoTextInteraction</set>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<widget class="QLabel" name="labelFilePath">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="text">
<string>File Path:</string>
</property>
<property name="textInteractionFlags">
<set>Qt::NoTextInteraction</set>
</property>
</widget>
</item>
<item row="0" column="1" colspan="5">
<widget class="QLabel" name="filePath"/>
<item row="1" column="3">
<widget class="QLabel" name="revision">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="text">
<string>No revision</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
</layout>
</item>
@ -93,39 +178,81 @@
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollWidget">
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>646</width>
<height>238</height>
<width>662</width>
<height>302</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="verticalSpacing">
<number>1</number>
<layout class="QGridLayout" name="scrollAreaLayout">
<property name="spacing">
<number>3</number>
</property>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<layout class="QHBoxLayout" name="buttonLayout">
<item>
<widget class="QPushButton" name="newButton">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Add a tag to this score.</string>
</property>
<property name="text">
<string notr="true">+</string>
<string>New...</string>
</property>
<property name="autoRepeat">
<bool>true</bool>
</property>
<property name="autoRepeatDelay">
<number>500</number>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="okButton">
<property name="text">
<string>Ok</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="cancelButton">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="saveButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="text">
<string>Save</string>
</property>
</widget>
</item>
@ -133,37 +260,43 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>newButton</tabstop>
<tabstop>saveButton</tabstop>
<tabstop>okButton</tabstop>
<tabstop>cancelButton</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<sender>okButton</sender>
<signal>clicked()</signal>
<receiver>MetaEditDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
<x>499</x>
<y>395</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
<x>435</x>
<y>389</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<sender>cancelButton</sender>
<signal>clicked()</signal>
<receiver>MetaEditDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
<x>585</x>
<y>395</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
<x>546</x>
<y>405</y>
</hint>
</hints>
</connection>

View file

@ -185,5 +185,6 @@
<file>data/icons/triangleUp.svg</file>
<file>data/icons/arrowsMoveToTop.svg</file>
<file>data/win_opengl_buglist.json</file>
<file>data/icons/bin.svg</file>
</qresource>
</RCC>