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+
2948ScmSkyCultureDialog::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
174201void 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+
343475QString 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+
362505scm::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 );
0 commit comments