Skip to content

Commit d4673b7

Browse files
committed
SCM: Automate formatting of references
Now users will edit an actual list of references: a QTreeWidget, not having to deal with the Markdown syntax we use.
1 parent 5379769 commit d4673b7

File tree

3 files changed

+230
-16
lines changed

3 files changed

+230
-16
lines changed

plugins/SkyCultureMaker/src/gui/ScmSkyCultureDialog.cpp

Lines changed: 145 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,27 @@
2424
#include "ScmSkyCultureDialog.hpp"
2525
#include "ui_scmSkyCultureDialog.h"
2626
#include <cassert>
27+
#include <QStyledItemDelegate>
2728
#include <QDebug>
2829

30+
namespace
31+
{
32+
33+
class NoEditDelegate : public QStyledItemDelegate
34+
{
35+
public:
36+
NoEditDelegate(QObject* parent = nullptr)
37+
: QStyledItemDelegate(parent)
38+
{
39+
}
40+
QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override
41+
{
42+
return nullptr;
43+
}
44+
};
45+
46+
}
47+
2948
ScmSkyCultureDialog::ScmSkyCultureDialog(SkyCultureMaker *maker)
3049
: StelDialogSeparate("ScmSkyCultureDialog")
3150
, maker(maker)
@@ -169,6 +188,14 @@ void ScmSkyCultureDialog::createDialogContent()
169188
ui->classificationCB->setCurrentIndex(index);
170189
}
171190
}
191+
192+
resetReferences();
193+
ui->referencesList->setItemDelegateForColumn(0, new NoEditDelegate(ui->referencesList));
194+
connect(ui->addRefBtn, &QPushButton::clicked, this, &ScmSkyCultureDialog::addNewReference);
195+
connect(ui->removeRefBtn, &QPushButton::clicked, this, &ScmSkyCultureDialog::removeReference);
196+
connect(ui->moveRefUpBtn, &QPushButton::clicked, this, &ScmSkyCultureDialog::moveCurrentReferenceUp);
197+
connect(ui->moveRefDownBtn, &QPushButton::clicked, this, &ScmSkyCultureDialog::moveCurrentReferenceDown);
198+
connect(ui->referencesList, &QTreeWidget::currentItemChanged, this, &ScmSkyCultureDialog::updateReferencesButtons);
172199
}
173200

174201
void ScmSkyCultureDialog::handleFontChanged()
@@ -340,6 +367,111 @@ QString ScmSkyCultureDialog::getDisplayNameFromConstellation(const scm::ScmConst
340367
return constellation.getEnglishName() + " (" + constellation.getId() + ")";
341368
}
342369

370+
void ScmSkyCultureDialog::resetReferences()
371+
{
372+
if (ui && dialog)
373+
{
374+
ui->referencesList->clear();
375+
ui->moveRefUpBtn->setEnabled(false);
376+
ui->moveRefDownBtn->setEnabled(false);
377+
ui->removeRefBtn->setEnabled(false);
378+
}
379+
}
380+
381+
void ScmSkyCultureDialog::updateReferencesButtons()
382+
{
383+
const auto count = ui->referencesList->topLevelItemCount();
384+
const auto currentItem = ui->referencesList->currentItem();
385+
386+
ui->removeRefBtn->setDisabled(count == 0 || !currentItem);
387+
388+
if (count <= 1 || !currentItem)
389+
{
390+
ui->moveRefUpBtn->setDisabled(true);
391+
ui->moveRefDownBtn->setDisabled(true);
392+
return;
393+
}
394+
const auto rootItem = ui->referencesList->invisibleRootItem();
395+
Q_ASSERT(rootItem);
396+
const auto row = rootItem->indexOfChild(currentItem);
397+
ui->moveRefUpBtn->setDisabled(row == 0);
398+
ui->moveRefDownBtn->setDisabled(row == count - 1);
399+
}
400+
401+
void ScmSkyCultureDialog::updateReferencesNumeration()
402+
{
403+
for (int row = 0; row < ui->referencesList->topLevelItemCount(); ++row)
404+
{
405+
ui->referencesList->topLevelItem(row)->setText(0, QString("#%1").arg(row + 1));
406+
}
407+
}
408+
409+
void ScmSkyCultureDialog::addNewReference()
410+
{
411+
const auto num = ui->referencesList->topLevelItemCount() + 1;
412+
const QStringList labels{QString("#%1").arg(num), ""};
413+
const auto item = new QTreeWidgetItem(labels);
414+
item->setFlags(item->flags() | Qt::ItemIsEditable);
415+
ui->referencesList->addTopLevelItem(item);
416+
ui->referencesList->setCurrentItem(item, 1);
417+
ui->referencesList->resizeColumnToContents(0);
418+
ui->referencesList->editItem(item, 1);
419+
420+
updateReferencesButtons();
421+
}
422+
423+
void ScmSkyCultureDialog::removeReference()
424+
{
425+
const auto currentItem = ui->referencesList->currentItem();
426+
if (!currentItem) return;
427+
const auto rootItem = ui->referencesList->invisibleRootItem();
428+
Q_ASSERT(rootItem);
429+
const auto row = rootItem->indexOfChild(currentItem);
430+
const auto itemToRemove = ui->referencesList->takeTopLevelItem(row);
431+
Q_ASSERT(itemToRemove == currentItem); Q_UNUSED(itemToRemove);
432+
updateReferencesNumeration();
433+
updateReferencesButtons();
434+
}
435+
436+
void ScmSkyCultureDialog::moveCurrentReferenceUp()
437+
{
438+
const auto currentItem = ui->referencesList->currentItem();
439+
if (!currentItem) return;
440+
441+
const auto rootItem = ui->referencesList->invisibleRootItem();
442+
Q_ASSERT(rootItem);
443+
const auto row = rootItem->indexOfChild(currentItem);
444+
if (row == 0) return;
445+
446+
const auto itemToMove = ui->referencesList->takeTopLevelItem(row);
447+
Q_ASSERT(itemToMove == currentItem);
448+
ui->referencesList->insertTopLevelItem(row-1, itemToMove);
449+
ui->referencesList->setCurrentItem(itemToMove, 1);
450+
451+
updateReferencesNumeration();
452+
updateReferencesButtons();
453+
}
454+
455+
void ScmSkyCultureDialog::moveCurrentReferenceDown()
456+
{
457+
const auto currentItem = ui->referencesList->currentItem();
458+
if (!currentItem) return;
459+
460+
const auto rootItem = ui->referencesList->invisibleRootItem();
461+
Q_ASSERT(rootItem);
462+
const auto row = rootItem->indexOfChild(currentItem);
463+
const auto count = ui->referencesList->topLevelItemCount();
464+
if (row == count - 1) return;
465+
466+
const auto itemToMove = ui->referencesList->takeTopLevelItem(row);
467+
Q_ASSERT(itemToMove == currentItem);
468+
ui->referencesList->insertTopLevelItem(row+1, itemToMove);
469+
ui->referencesList->setCurrentItem(itemToMove, 1);
470+
471+
updateReferencesNumeration();
472+
updateReferencesButtons();
473+
}
474+
343475
QString ScmSkyCultureDialog::makeConstellationsSection() const
344476
{
345477
if (!constellations) return {};
@@ -359,6 +491,17 @@ QString ScmSkyCultureDialog::makeConstellationsSection() const
359491
return text.trimmed();
360492
}
361493

494+
QString ScmSkyCultureDialog::makeReferencesSection() const
495+
{
496+
QString refs;
497+
for (int row = 0; row < ui->referencesList->topLevelItemCount(); ++row)
498+
{
499+
const auto text = ui->referencesList->topLevelItem(row)->text(1);
500+
refs += QString(" - [#%1]: %2\n").arg(row + 1).arg(text.trimmed());
501+
}
502+
return refs;
503+
}
504+
362505
scm::Description ScmSkyCultureDialog::getDescriptionFromTextEdit() const
363506
{
364507
scm::Description desc;
@@ -375,7 +518,7 @@ scm::Description ScmSkyCultureDialog::getDescriptionFromTextEdit() const
375518

376519
desc.constellations = makeConstellationsSection();
377520

378-
desc.references = ui->referencesTE->toPlainText();
521+
desc.references = makeReferencesSection();
379522

380523
desc.authors = ui->authorsTE->toPlainText();
381524
desc.about = ui->aboutTE->toPlainText();
@@ -401,7 +544,7 @@ void ScmSkyCultureDialog::resetDialog()
401544
ui->zodiacTE->clear();
402545
ui->milkyWayTE->clear();
403546
ui->otherObjectsTE->clear();
404-
ui->referencesTE->clear();
547+
resetReferences();
405548
ui->acknowledgementsTE->clear();
406549

407550
ui->licenseCB->setCurrentIndex(0);

plugins/SkyCultureMaker/src/gui/ScmSkyCultureDialog.hpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,30 @@ private slots:
118118
*/
119119
QString makeConstellationsSection() const;
120120

121+
/**
122+
* @brief Clears the references list and resets the helper buttons.
123+
*/
124+
void resetReferences();
125+
126+
void addNewReference();
127+
void removeReference();
128+
void updateReferencesButtons();
129+
void moveCurrentReferenceUp();
130+
void moveCurrentReferenceDown();
131+
void updateReferencesNumeration();
132+
121133
/**
122134
* @brief Gets the description from the text edit.
123135
*
124136
* @return The description from the text edit.
125137
*/
126138
scm::Description getDescriptionFromTextEdit() const;
127139

140+
/**
141+
* @brief Compiles the References section from all the references in the list.
142+
*/
143+
QString makeReferencesSection() const;
144+
128145
/**
129146
* @brief Opens the constellation dialog with data for a given constellation.
130147
* @param constellationId The ID of the constellation to open the dialog for.

plugins/SkyCultureMaker/src/gui/scmSkyCultureDialog.ui

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,9 @@
237237
<property name="geometry">
238238
<rect>
239239
<x>0</x>
240-
<y>-1317</y>
240+
<y>-1481</y>
241241
<width>800</width>
242-
<height>2235</height>
242+
<height>2342</height>
243243
</rect>
244244
</property>
245245
<layout class="QVBoxLayout" name="descriptionLayout">
@@ -526,17 +526,69 @@
526526
</widget>
527527
</item>
528528
<item>
529-
<widget class="QTextEdit" name="referencesTE">
530-
<property name="sizeAdjustPolicy">
531-
<enum>QAbstractScrollArea::AdjustToContents</enum>
532-
</property>
533-
<property name="acceptRichText">
534-
<bool>false</bool>
535-
</property>
536-
<property name="placeholderText">
537-
<string notr="true"> - [#1]: Author: Title, (Journal, ...), Publisher, Location, Year</string>
538-
</property>
539-
</widget>
529+
<layout class="QGridLayout" name="referencesLayout">
530+
<item row="2" column="0">
531+
<widget class="QPushButton" name="addRefBtn">
532+
<property name="text">
533+
<string>Add</string>
534+
</property>
535+
</widget>
536+
</item>
537+
<item row="2" column="1">
538+
<widget class="QPushButton" name="moveRefUpBtn">
539+
<property name="text">
540+
<string/>
541+
</property>
542+
<property name="icon">
543+
<iconset resource="../../../../data/gui/guiRes.qrc">
544+
<normaloff>:/graphicGui/uibtUp.png</normaloff>
545+
<disabledoff>:/graphicGui/uibtUp-disabled.png</disabledoff>:/graphicGui/uibtUp.png</iconset>
546+
</property>
547+
</widget>
548+
</item>
549+
<item row="2" column="2">
550+
<widget class="QPushButton" name="moveRefDownBtn">
551+
<property name="text">
552+
<string/>
553+
</property>
554+
<property name="icon">
555+
<iconset resource="../../../../data/gui/guiRes.qrc">
556+
<normaloff>:/graphicGui/uibtDown.png</normaloff>
557+
<disabledoff>:/graphicGui/uibtDown-disabled.png</disabledoff>:/graphicGui/uibtDown.png</iconset>
558+
</property>
559+
</widget>
560+
</item>
561+
<item row="2" column="3">
562+
<widget class="QPushButton" name="removeRefBtn">
563+
<property name="text">
564+
<string>Remove</string>
565+
</property>
566+
</widget>
567+
</item>
568+
<item row="0" column="0" colspan="4">
569+
<widget class="QTreeWidget" name="referencesList">
570+
<property name="rootIsDecorated">
571+
<bool>false</bool>
572+
</property>
573+
<property name="uniformRowHeights">
574+
<bool>true</bool>
575+
</property>
576+
<property name="headerHidden">
577+
<bool>true</bool>
578+
</property>
579+
<column>
580+
<property name="text">
581+
<string/>
582+
</property>
583+
</column>
584+
<column>
585+
<property name="text">
586+
<string/>
587+
</property>
588+
</column>
589+
</widget>
590+
</item>
591+
</layout>
540592
</item>
541593
<item>
542594
<widget class="QLabel" name="authorsLbl">
@@ -635,6 +687,8 @@
635687
<container>1</container>
636688
</customwidget>
637689
</customwidgets>
638-
<resources/>
690+
<resources>
691+
<include location="../../../../data/gui/guiRes.qrc"/>
692+
</resources>
639693
<connections/>
640694
</ui>

0 commit comments

Comments
 (0)