mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Good deal of Code Cleanup for the maintab
Some cleanup was needed in the MainTab code for ages, now the Edition / Cancel / Ok of the Notes tab is way more intuitive on the code level. This is needed to support multidive edition on the Cylinders and Weigths too, since it's a bit more complicated, I didn't want to start with a Spaguetti Code. Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
This commit is contained in:
parent
955c1c1fe5
commit
bcefa4baff
3 changed files with 91 additions and 153 deletions
|
@ -33,6 +33,7 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
|
||||||
ui->cylinders->setModel(cylindersModel);
|
ui->cylinders->setModel(cylindersModel);
|
||||||
ui->weights->setModel(weightModel);
|
ui->weights->setModel(weightModel);
|
||||||
ui->diveNotesMessage->hide();
|
ui->diveNotesMessage->hide();
|
||||||
|
ui->notesButtonBox->hide();
|
||||||
ui->diveNotesMessage->setCloseButtonVisible(false);
|
ui->diveNotesMessage->setCloseButtonVisible(false);
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
setDocumentMode(false);
|
setDocumentMode(false);
|
||||||
|
@ -41,17 +42,7 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
|
||||||
#endif
|
#endif
|
||||||
// we start out with the fields read-only; once things are
|
// we start out with the fields read-only; once things are
|
||||||
// filled from a dive, they are made writeable
|
// filled from a dive, they are made writeable
|
||||||
ui->location->setReadOnly(true);
|
setEnabled(false);
|
||||||
ui->coordinates->setReadOnly(true);
|
|
||||||
ui->divemaster->setReadOnly(true);
|
|
||||||
ui->buddy->setReadOnly(true);
|
|
||||||
ui->suit->setReadOnly(true);
|
|
||||||
ui->notes->setReadOnly(true);
|
|
||||||
ui->rating->setReadOnly(true);
|
|
||||||
ui->visibility->setReadOnly(true);
|
|
||||||
|
|
||||||
ui->editAccept->hide();
|
|
||||||
ui->editReset->hide();
|
|
||||||
|
|
||||||
ui->location->installEventFilter(this);
|
ui->location->installEventFilter(this);
|
||||||
ui->coordinates->installEventFilter(this);
|
ui->coordinates->installEventFilter(this);
|
||||||
|
@ -78,7 +69,8 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
|
||||||
|
|
||||||
connect(ui->cylinders->view(), SIGNAL(clicked(QModelIndex)), this, SLOT(editCylinderWidget(QModelIndex)));
|
connect(ui->cylinders->view(), SIGNAL(clicked(QModelIndex)), this, SLOT(editCylinderWidget(QModelIndex)));
|
||||||
connect(ui->weights->view(), SIGNAL(clicked(QModelIndex)), this, SLOT(editWeigthWidget(QModelIndex)));
|
connect(ui->weights->view(), SIGNAL(clicked(QModelIndex)), this, SLOT(editWeigthWidget(QModelIndex)));
|
||||||
|
connect(ui->notesButtonBox, SIGNAL(accepted()), this, SLOT(acceptChanges()));
|
||||||
|
connect(ui->notesButtonBox, SIGNAL(rejected()), this, SLOT(rejectChanges()));
|
||||||
ui->cylinders->view()->setItemDelegateForColumn(CylindersModel::TYPE, new TankInfoDelegate());
|
ui->cylinders->view()->setItemDelegateForColumn(CylindersModel::TYPE, new TankInfoDelegate());
|
||||||
ui->weights->view()->setItemDelegateForColumn(WeightModel::TYPE, new WSInfoDelegate());
|
ui->weights->view()->setItemDelegateForColumn(WeightModel::TYPE, new WSInfoDelegate());
|
||||||
|
|
||||||
|
@ -94,22 +86,56 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
|
||||||
|
|
||||||
void MainTab::enableEdition()
|
void MainTab::enableEdition()
|
||||||
{
|
{
|
||||||
if (ui->editAccept->isVisible() || !selected_dive)
|
mainWindow()->dive_list()->setEnabled(false);
|
||||||
|
if (ui->notesButtonBox->isVisible() || !selected_dive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ui->editAccept->setChecked(true);
|
// We may be editing one or more dives here. backup everything.
|
||||||
ui->editAccept->show();
|
notesBackup.clear();
|
||||||
ui->editReset->show();
|
ui->notesButtonBox->show();
|
||||||
on_editAccept_clicked(true);
|
|
||||||
|
if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) {
|
||||||
|
// we are editing trip location and notes
|
||||||
|
ui->diveNotesMessage->setText(tr("This trip is being edited. Select Save or Undo when ready."));
|
||||||
|
ui->diveNotesMessage->animatedShow();
|
||||||
|
notesBackup[NULL].notes = ui->notes->toPlainText();
|
||||||
|
notesBackup[NULL].location = ui->location->text();
|
||||||
|
editMode = TRIP;
|
||||||
|
} else {
|
||||||
|
ui->diveNotesMessage->setText(tr("This dive is being edited. Select Save or Undo when ready."));
|
||||||
|
ui->diveNotesMessage->animatedShow();
|
||||||
|
|
||||||
|
// We may be editing one or more dives here. backup everything.
|
||||||
|
struct dive *mydive;
|
||||||
|
for (int i = 0; i < dive_table.nr; i++) {
|
||||||
|
mydive = get_dive(i);
|
||||||
|
if (!mydive)
|
||||||
|
continue;
|
||||||
|
if (!mydive->selected)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
notesBackup[mydive].buddy = QString(mydive->buddy);
|
||||||
|
notesBackup[mydive].suit = QString(mydive->suit);
|
||||||
|
notesBackup[mydive].notes = QString(mydive->notes);
|
||||||
|
notesBackup[mydive].divemaster = QString(mydive->divemaster);
|
||||||
|
notesBackup[mydive].location = QString(mydive->location);
|
||||||
|
notesBackup[mydive].rating = mydive->rating;
|
||||||
|
notesBackup[mydive].visibility = mydive->visibility;
|
||||||
|
notesBackup[mydive].latitude = mydive->latitude;
|
||||||
|
notesBackup[mydive].longitude = mydive->longitude;
|
||||||
|
notesBackup[mydive].coordinates = ui->location->text();
|
||||||
|
}
|
||||||
|
editMode = DIVE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MainTab::eventFilter(QObject* object, QEvent* event)
|
bool MainTab::eventFilter(QObject* object, QEvent* event)
|
||||||
{
|
{
|
||||||
if (event->type() == QEvent::FocusIn && (object == ui->rating || object == ui->visibility)){
|
if (isEnabled() && event->type() == QEvent::FocusIn && (object == ui->rating || object == ui->visibility)){
|
||||||
enableEdition();
|
enableEdition();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event->type() == QEvent::MouseButtonPress) {
|
if (isEnabled() && event->type() == QEvent::MouseButtonPress ) {
|
||||||
enableEdition();
|
enableEdition();
|
||||||
}
|
}
|
||||||
return false; // don't "eat" the event.
|
return false; // don't "eat" the event.
|
||||||
|
@ -153,6 +179,9 @@ void MainTab::clearStats()
|
||||||
|
|
||||||
void MainTab::updateDiveInfo(int dive)
|
void MainTab::updateDiveInfo(int dive)
|
||||||
{
|
{
|
||||||
|
if(!isEnabled())
|
||||||
|
setEnabled(true);
|
||||||
|
|
||||||
editMode = NONE;
|
editMode = NONE;
|
||||||
// This method updates ALL tabs whenever a new dive or trip is
|
// This method updates ALL tabs whenever a new dive or trip is
|
||||||
// selected.
|
// selected.
|
||||||
|
@ -192,10 +221,8 @@ void MainTab::updateDiveInfo(int dive)
|
||||||
ui->visibilityLabel->setVisible(false);
|
ui->visibilityLabel->setVisible(false);
|
||||||
// rename the remaining fields and fill data from selected trip
|
// rename the remaining fields and fill data from selected trip
|
||||||
dive_trip_t *currentTrip = *mainWindow()->dive_list()->selectedTrips.begin();
|
dive_trip_t *currentTrip = *mainWindow()->dive_list()->selectedTrips.begin();
|
||||||
ui->location->setReadOnly(false);
|
|
||||||
ui->LocationLabel->setText(tr("Trip Location"));
|
ui->LocationLabel->setText(tr("Trip Location"));
|
||||||
ui->location->setText(currentTrip->location);
|
ui->location->setText(currentTrip->location);
|
||||||
ui->notes->setReadOnly(false);
|
|
||||||
ui->NotesLabel->setText(tr("Trip Notes"));
|
ui->NotesLabel->setText(tr("Trip Notes"));
|
||||||
ui->notes->setText(currentTrip->notes);
|
ui->notes->setText(currentTrip->notes);
|
||||||
} else {
|
} else {
|
||||||
|
@ -211,19 +238,11 @@ void MainTab::updateDiveInfo(int dive)
|
||||||
ui->visibilityLabel->setVisible(true);
|
ui->visibilityLabel->setVisible(true);
|
||||||
ui->BuddyLabel->setVisible(true);
|
ui->BuddyLabel->setVisible(true);
|
||||||
ui->DivemasterLabel->setVisible(true);
|
ui->DivemasterLabel->setVisible(true);
|
||||||
ui->divemaster->setReadOnly(false);
|
|
||||||
ui->buddy->setReadOnly(false);
|
|
||||||
ui->suit->setReadOnly(false);
|
|
||||||
ui->rating->setReadOnly(false);
|
|
||||||
ui->visibility->setReadOnly(false);
|
|
||||||
/* and fill them from the dive */
|
/* and fill them from the dive */
|
||||||
ui->rating->setCurrentStars(d->rating);
|
ui->rating->setCurrentStars(d->rating);
|
||||||
ui->visibility->setCurrentStars(d->visibility);
|
ui->visibility->setCurrentStars(d->visibility);
|
||||||
// reset labels in case we last displayed trip notes
|
// reset labels in case we last displayed trip notes
|
||||||
ui->location->setReadOnly(false);
|
|
||||||
ui->coordinates->setReadOnly(false);
|
|
||||||
ui->LocationLabel->setText(tr("Location"));
|
ui->LocationLabel->setText(tr("Location"));
|
||||||
ui->notes->setReadOnly(false);
|
|
||||||
ui->NotesLabel->setText(tr("Notes"));
|
ui->NotesLabel->setText(tr("Notes"));
|
||||||
}
|
}
|
||||||
ui->maximumDepthText->setText(get_depth_string(d->maxdepth, TRUE));
|
ui->maximumDepthText->setText(get_depth_string(d->maxdepth, TRUE));
|
||||||
|
@ -272,15 +291,6 @@ void MainTab::updateDiveInfo(int dive)
|
||||||
cylindersModel->setDive(d);
|
cylindersModel->setDive(d);
|
||||||
weightModel->setDive(d);
|
weightModel->setDive(d);
|
||||||
} else {
|
} else {
|
||||||
/* make the fields read-only */
|
|
||||||
ui->location->setReadOnly(true);
|
|
||||||
ui->coordinates->setReadOnly(true);
|
|
||||||
ui->divemaster->setReadOnly(true);
|
|
||||||
ui->buddy->setReadOnly(true);
|
|
||||||
ui->suit->setReadOnly(true);
|
|
||||||
ui->notes->setReadOnly(true);
|
|
||||||
ui->rating->setReadOnly(true);
|
|
||||||
ui->visibility->setReadOnly(true);
|
|
||||||
/* clear the fields */
|
/* clear the fields */
|
||||||
ui->rating->setCurrentStars(0);
|
ui->rating->setCurrentStars(0);
|
||||||
ui->sacText->clear();
|
ui->sacText->clear();
|
||||||
|
@ -327,61 +337,12 @@ void MainTab::reload()
|
||||||
DiveMasterCompletionModel::instance()->updateModel();
|
DiveMasterCompletionModel::instance()->updateModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainTab::on_editAccept_clicked(bool edit)
|
void MainTab::acceptChanges()
|
||||||
{
|
{
|
||||||
ui->location->setReadOnly(!edit);
|
mainWindow()->dive_list()->setEnabled(true);
|
||||||
ui->coordinates->setReadOnly(!edit);
|
|
||||||
ui->divemaster->setReadOnly(!edit);
|
|
||||||
ui->buddy->setReadOnly(!edit);
|
|
||||||
ui->suit->setReadOnly(!edit);
|
|
||||||
ui->notes->setReadOnly(!edit);
|
|
||||||
ui->rating->setReadOnly(!edit);
|
|
||||||
ui->visibility->setReadOnly(!edit);
|
|
||||||
|
|
||||||
mainWindow()->dive_list()->setEnabled(!edit);
|
|
||||||
|
|
||||||
if (edit) {
|
|
||||||
|
|
||||||
// We may be editing one or more dives here. backup everything.
|
|
||||||
notesBackup.clear();
|
|
||||||
|
|
||||||
if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) {
|
|
||||||
// we are editing trip location and notes
|
|
||||||
ui->diveNotesMessage->setText(tr("This trip is being edited. Select Save or Undo when ready."));
|
|
||||||
ui->diveNotesMessage->animatedShow();
|
|
||||||
notesBackup[NULL].notes = ui->notes->toPlainText();
|
|
||||||
notesBackup[NULL].location = ui->location->text();
|
|
||||||
editMode = TRIP;
|
|
||||||
} else {
|
|
||||||
ui->diveNotesMessage->setText(tr("This dive is being edited. Select Save or Undo when ready."));
|
|
||||||
ui->diveNotesMessage->animatedShow();
|
|
||||||
|
|
||||||
// We may be editing one or more dives here. backup everything.
|
|
||||||
struct dive *mydive;
|
|
||||||
for (int i = 0; i < dive_table.nr; i++) {
|
|
||||||
mydive = get_dive(i);
|
|
||||||
if (!mydive)
|
|
||||||
continue;
|
|
||||||
if (!mydive->selected)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
notesBackup[mydive].buddy = QString(mydive->buddy);
|
|
||||||
notesBackup[mydive].suit = QString(mydive->suit);
|
|
||||||
notesBackup[mydive].notes = QString(mydive->notes);
|
|
||||||
notesBackup[mydive].divemaster = QString(mydive->divemaster);
|
|
||||||
notesBackup[mydive].location = QString(mydive->location);
|
|
||||||
notesBackup[mydive].rating = mydive->rating;
|
|
||||||
notesBackup[mydive].visibility = mydive->visibility;
|
|
||||||
notesBackup[mydive].latitude = mydive->latitude;
|
|
||||||
notesBackup[mydive].longitude = mydive->longitude;
|
|
||||||
notesBackup[mydive].coordinates = ui->location->text();
|
|
||||||
}
|
|
||||||
editMode = DIVE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ui->diveNotesMessage->animatedHide();
|
ui->diveNotesMessage->animatedHide();
|
||||||
ui->editAccept->hide();
|
ui->notesButtonBox->hide();
|
||||||
ui->editReset->hide();
|
|
||||||
/* now figure out if things have changed */
|
/* now figure out if things have changed */
|
||||||
if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) {
|
if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) {
|
||||||
if (notesBackup[NULL].notes != ui->notes->toPlainText() ||
|
if (notesBackup[NULL].notes != ui->notes->toPlainText() ||
|
||||||
|
@ -406,7 +367,7 @@ void MainTab::on_editAccept_clicked(bool edit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
editMode = NONE;
|
editMode = NONE;
|
||||||
}
|
|
||||||
QPalette p;
|
QPalette p;
|
||||||
ui->buddy->setPalette(p);
|
ui->buddy->setPalette(p);
|
||||||
ui->notes->setPalette(p);
|
ui->notes->setPalette(p);
|
||||||
|
@ -425,11 +386,9 @@ void MainTab::on_editAccept_clicked(bool edit)
|
||||||
free(what);\
|
free(what);\
|
||||||
what = strdup(textByteArray.data());
|
what = strdup(textByteArray.data());
|
||||||
|
|
||||||
void MainTab::on_editReset_clicked()
|
void MainTab::rejectChanges()
|
||||||
{
|
{
|
||||||
if (!ui->editAccept->isChecked())
|
mainWindow()->dive_list()->setEnabled(true);
|
||||||
return;
|
|
||||||
|
|
||||||
if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1){
|
if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1){
|
||||||
ui->notes->setText(notesBackup[NULL].notes );
|
ui->notes->setText(notesBackup[NULL].notes );
|
||||||
ui->location->setText(notesBackup[NULL].location);
|
ui->location->setText(notesBackup[NULL].location);
|
||||||
|
@ -464,21 +423,10 @@ void MainTab::on_editReset_clicked()
|
||||||
mydive->visibility = notesBackup[mydive].visibility;
|
mydive->visibility = notesBackup[mydive].visibility;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ui->editAccept->setChecked(false);
|
|
||||||
ui->diveNotesMessage->animatedHide();
|
ui->diveNotesMessage->animatedHide();
|
||||||
|
|
||||||
ui->location->setReadOnly(true);
|
|
||||||
ui->coordinates->setReadOnly(true);
|
|
||||||
ui->divemaster->setReadOnly(true);
|
|
||||||
ui->buddy->setReadOnly(true);
|
|
||||||
ui->suit->setReadOnly(true);
|
|
||||||
ui->notes->setReadOnly(true);
|
|
||||||
ui->rating->setReadOnly(true);
|
|
||||||
ui->visibility->setReadOnly(true);
|
|
||||||
mainWindow()->dive_list()->setEnabled(true);
|
mainWindow()->dive_list()->setEnabled(true);
|
||||||
|
|
||||||
ui->editAccept->hide();
|
ui->notesButtonBox->hide();
|
||||||
ui->editReset->hide();
|
|
||||||
notesBackup.clear();
|
notesBackup.clear();
|
||||||
QPalette p;
|
QPalette p;
|
||||||
ui->buddy->setPalette(p);
|
ui->buddy->setPalette(p);
|
||||||
|
|
|
@ -56,8 +56,8 @@ public slots:
|
||||||
void addCylinder_clicked();
|
void addCylinder_clicked();
|
||||||
void addWeight_clicked();
|
void addWeight_clicked();
|
||||||
void updateDiveInfo(int dive);
|
void updateDiveInfo(int dive);
|
||||||
void on_editAccept_clicked(bool edit);
|
void acceptChanges();
|
||||||
void on_editReset_clicked();
|
void rejectChanges();
|
||||||
void on_location_textChanged(const QString& text);
|
void on_location_textChanged(const QString& text);
|
||||||
void on_coordinates_textChanged(const QString& text);
|
void on_coordinates_textChanged(const QString& text);
|
||||||
void on_divemaster_textChanged(const QString& text);
|
void on_divemaster_textChanged(const QString& text);
|
||||||
|
|
|
@ -24,14 +24,14 @@
|
||||||
<item row="4" column="0" colspan="2">
|
<item row="4" column="0" colspan="2">
|
||||||
<widget class="QLineEdit" name="coordinates">
|
<widget class="QLineEdit" name="coordinates">
|
||||||
<property name="readOnly">
|
<property name="readOnly">
|
||||||
<bool>true</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="0" colspan="2">
|
<item row="11" column="0" colspan="2">
|
||||||
<widget class="QTextEdit" name="notes">
|
<widget class="QTextEdit" name="notes">
|
||||||
<property name="readOnly">
|
<property name="readOnly">
|
||||||
<bool>true</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -45,28 +45,28 @@
|
||||||
<item row="6" column="0">
|
<item row="6" column="0">
|
||||||
<widget class="QLineEdit" name="divemaster">
|
<widget class="QLineEdit" name="divemaster">
|
||||||
<property name="readOnly">
|
<property name="readOnly">
|
||||||
<bool>true</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="1">
|
<item row="8" column="1">
|
||||||
<widget class="QLineEdit" name="suit">
|
<widget class="QLineEdit" name="suit">
|
||||||
<property name="readOnly">
|
<property name="readOnly">
|
||||||
<bool>true</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QLineEdit" name="buddy">
|
<widget class="QLineEdit" name="buddy">
|
||||||
<property name="readOnly">
|
<property name="readOnly">
|
||||||
<bool>true</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0" colspan="2">
|
<item row="2" column="0" colspan="2">
|
||||||
<widget class="QLineEdit" name="location">
|
<widget class="QLineEdit" name="location">
|
||||||
<property name="readOnly">
|
<property name="readOnly">
|
||||||
<bool>true</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -126,30 +126,20 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="1">
|
<item row="3" column="0">
|
||||||
<widget class="QPushButton" name="editReset">
|
<widget class="QLabel" name="CoordinatedLabel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Undo</string>
|
<string>Coordinates</string>
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="12" column="0">
|
|
||||||
<widget class="QPushButton" name="editAccept">
|
|
||||||
<property name="text">
|
|
||||||
<string>Save</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0" colspan="2">
|
<item row="0" column="0" colspan="2">
|
||||||
<widget class="KMessageWidget" name="diveNotesMessage" native="true"/>
|
<widget class="KMessageWidget" name="diveNotesMessage" native="true"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="12" column="0" colspan="2">
|
||||||
<widget class="QLabel" name="CoordinatedLabel">
|
<widget class="QDialogButtonBox" name="notesButtonBox">
|
||||||
<property name="text">
|
<property name="standardButtons">
|
||||||
<string>Coordinates</string>
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
Loading…
Add table
Reference in a new issue