Marble

RoutingProfileSettingsDialog.cpp
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2010 Niko Sams <[email protected]>
4 //
5 
6 
7 #include "RoutingProfileSettingsDialog.h"
8 
9 #include <QStandardItemModel>
10 
11 #include "MarbleGlobal.h"
12 #include "MarbleDebug.h"
13 #include "RoutingProfilesModel.h"
14 #include "PluginManager.h"
15 
16 #include "ui_RoutingProfileSettingsDialog.h"
17 
18 namespace Marble {
19 
20 
21 RoutingProfileSettingsDialog::RoutingProfileSettingsDialog( const PluginManager *pluginManager, RoutingProfilesModel *profilesModel, QWidget* parent )
22  : QDialog( parent ),
23  m_profilesModel ( profilesModel ), m_dialog( nullptr ), m_dialogLayout( nullptr )
24 {
25  m_ui = new Ui_RoutingProfileSettingsDialog();
26  m_ui->setupUi( this );
27  bool const smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen;
28  if ( smallScreen ) {
29  setMinimumHeight( 480 );
30  m_ui->services->setMinimumWidth( 280 );
31  m_ui->buttonBox->hide();
32  }
33 
34  QList<RoutingRunnerPlugin*> allPlugins = pluginManager->routingRunnerPlugins();
35  for( RoutingRunnerPlugin* plugin: allPlugins ) {
36  m_plugins << plugin;
37  RoutingRunnerPlugin::ConfigWidget* configWidget = plugin->configWidget();
38  if ( configWidget ) {
39  m_configWidgets.insert( plugin, configWidget );
40  m_ui->settingsStack->addWidget( configWidget );
41  }
42  }
43 
44  m_servicesModel = new QStandardItemModel;
45  m_ui->services->setModel( m_servicesModel );
46  connect ( m_ui->services->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), SLOT(updateConfigWidget()), Qt::QueuedConnection );
47  connect ( m_servicesModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), SLOT(updateConfigWidget()) );
48 
49  connect ( m_ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()) );
50  connect ( m_ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()) );
51 
52  connect( m_ui->configureButton, SIGNAL(clicked()), this, SLOT(openConfigDialog()) );
53 }
54 
55 RoutingProfileSettingsDialog::~RoutingProfileSettingsDialog()
56 {
57  qDeleteAll( m_configWidgets );
58  delete m_ui;
59 }
60 
61 void RoutingProfileSettingsDialog::updateConfigWidget( )
62 {
63  QModelIndex current = m_ui->services->selectionModel()->currentIndex();
64 
65  if ( !current.isValid() ) {
66  m_ui->settingsStack->setEnabled( false );
67  return;
68  }
69 
70  RoutingRunnerPlugin *plugin = m_plugins.at( current.row() );
71  QWidget* configWidget = m_configWidgets[plugin];
72  if ( configWidget ) {
73  bool const smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen;
74  m_ui->settingsStack->setCurrentWidget( smallScreen ? m_ui->configurePage : configWidget );
75  m_ui->descriptionLabel->setText( plugin->description() );
76  m_ui->statusLabel->setText( plugin->statusMessage() );
77  QStandardItem *item = m_servicesModel->invisibleRootItem()->child( current.row() );
78  m_ui->settingsStack->setEnabled( item->checkState() == Qt::Checked );
79  } else {
80  m_ui->settingsStack->setEnabled( false );
81  m_ui->noConfigDescriptionLabel->setText( plugin->description() );
82  m_ui->noConfigStatusLabel->setText( plugin->statusMessage() );
83  m_ui->settingsStack->setCurrentWidget( m_ui->noConfigAvailablePage );
84  }
85 }
86 
87 void RoutingProfileSettingsDialog::editProfile( int profileIndex )
88 {
89  QList<RoutingProfile> profiles = m_profilesModel->profiles();
90  m_ui->name->setText( profiles.at( profileIndex ).name() );
91 
92  m_servicesModel->clear();
93  for( RoutingRunnerPlugin *plugin: m_plugins ) {
94  QStandardItem *item = new QStandardItem( plugin->guiString() );
95  item->setCheckable( true );
96  if ( profiles[ profileIndex ].pluginSettings().contains( plugin->nameId() ) ) {
97  item->setCheckState( Qt::Checked );
98  QHash<QString, QVariant> settings = profiles[ profileIndex ].pluginSettings()[ plugin->nameId() ];
99  mDebug() << settings;
100  if ( m_configWidgets[plugin] ) {
101  m_configWidgets[plugin]->loadSettings( settings );
102  }
103  }
104  m_servicesModel->invisibleRootItem()->appendRow( item );
105  }
106  m_ui->settingsStack->setCurrentWidget( m_ui->selectServicePage );
107  m_ui->settingsStack->setEnabled( false );
108 
109  bool const smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen;
110  // Small screen profile (like maemo 5) does not have the "buttonBox"
111  if ( exec() != QDialog::Accepted && !smallScreen ) {
112  return;
113  }
114 
115  m_profilesModel->setProfileName( profileIndex, m_ui->name->text() );
116 
118  for ( int i=0; i < m_servicesModel->invisibleRootItem()->rowCount(); ++i) {
119  QStandardItem *item = m_servicesModel->invisibleRootItem()->child( i );
120  if ( item->checkState() == Qt::Checked ) {
121  QHash<QString, QVariant> settings;
122  if ( m_configWidgets[m_plugins[ i ]] ) {
123  settings = m_configWidgets[m_plugins[ i ]]->settings();
124  }
125  mDebug() << i << m_plugins[ i ]->nameId() << settings;
126  pluginSettings.insert( m_plugins[ i ]->nameId(), settings );
127  } else {
128  pluginSettings.remove( m_plugins[ i ]->nameId() );
129  }
130  }
131  m_profilesModel->setProfilePluginSettings( profileIndex, pluginSettings );
132 }
133 
134 void RoutingProfileSettingsDialog::openConfigDialog()
135 {
136  QModelIndex current = m_ui->services->selectionModel()->currentIndex();
137  if ( current.isValid() ) {
138  RoutingRunnerPlugin *plugin = m_plugins.at( current.row() );
139 
140  if ( !m_dialog ) {
141  m_dialog = new QDialog( this );
142 
143  m_dialogLayout = new QHBoxLayout();
144  m_dialogLayout->addWidget( m_configWidgets[plugin] );
145 
146  m_dialog->setLayout( m_dialogLayout );
147  m_dialog->setMinimumHeight( 480 );
148  } else {
149  m_dialogLayout->insertWidget( 0, m_configWidgets[plugin] );
150  }
151 
152  m_configWidgets[plugin]->show();
153  m_dialog->setWindowTitle( plugin->guiString() );
154  m_dialog->exec();
155  m_configWidgets[plugin]->hide();
156  m_dialogLayout->removeWidget( m_configWidgets[plugin] );
157  }
158 }
159 
160 }
161 
162 #include "moc_RoutingProfileSettingsDialog.cpp"
Qt::CheckState checkState() const const
QStandardItem * child(int row, int column) const const
QHash::iterator insert(const Key &key, const T &value)
const T & at(int i) const const
QueuedConnection
Binds a QML item to a specific geodetic location in screen coordinates.
bool isValid() const const
void setEnabled(bool enabled)
void insert(int i, const T &value)
int row() const const
int remove(const Key &key)
void clear()
void setCheckable(bool checkable)
void setCheckState(Qt::CheckState state)
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:31
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Sep 25 2023 03:50:20 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.