Skip to content

Commit 470d50b

Browse files
committed
Added 'Import Path' mechanism for scripting
1 parent 3d7ebd3 commit 470d50b

File tree

10 files changed

+271
-9
lines changed

10 files changed

+271
-9
lines changed

src/core/gui/dialogs/core_dialogs.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,17 @@ bool mbCoreDialogs::getFont(QFont &font, QWidget *parent, const QString &title,
113113
return ok;
114114
}
115115

116+
QString mbCoreDialogs::getExistingDirectory(QWidget *parent, const QString &caption, const QString &dir, QFileDialog::Options options)
117+
{
118+
QString tLastDir = dir.isEmpty() ? m_lastDir : dir;
119+
QString f = QFileDialog::getExistingDirectory(parent, caption, tLastDir, options);
120+
if (!f.isEmpty())
121+
{
122+
m_lastDir = QFileInfo(f).absolutePath();
123+
}
124+
return f;
125+
}
126+
116127
bool mbCoreDialogs::editSystemSettings(const QString &title)
117128
{
118129
return m_settings->editSettings(title);

src/core/gui/dialogs/core_dialogs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ class MB_EXPORT mbCoreDialogs
8585
QColorDialog::ColorDialogOptions options = QColorDialog::ColorDialogOptions());
8686
bool getFont(QFont &font, QWidget *parent = nullptr, const QString &title = QString(),
8787
QFontDialog::FontDialogOptions options = QFontDialog::FontDialogOptions());
88+
QString getExistingDirectory(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(),
89+
QFileDialog::Options options = QFileDialog::ShowDirsOnly);
8890
bool editSystemSettings(const QString& title = QString());
8991
void showProjectInfo(mbCoreProject *project);
9092

src/server/core/server.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ mbServer::Strings::Strings() : mbCore::Strings(),
4646
settings_scriptUseOptimization(QStringLiteral("Script.UseOptimization")),
4747
settings_scriptLoopPeriod (QStringLiteral("Script.LoopPeriod")),
4848
settings_scriptManual (QStringLiteral("Script.Manual")),
49-
settings_scriptDefault (QStringLiteral("Script.DefaultInterpreter"))
49+
settings_scriptDefault (QStringLiteral("Script.DefaultInterpreter")),
50+
settings_scriptImportPath (QStringLiteral("Script.ImportPath"))
5051
{
5152
}
5253

@@ -150,11 +151,12 @@ MBSETTINGS mbServer::cachedSettings() const
150151
{
151152
const Strings &s = Strings::instance();
152153
MBSETTINGS r = mbCore::cachedSettings();
153-
r[s.settings_scriptEnable ] = scriptEnable();
154-
r[s.settings_scriptUseOptimization ] = scriptUseOptimization();
155-
r[s.settings_scriptLoopPeriod ] = scriptLoopPeriod();
154+
r[s.settings_scriptEnable ] = scriptEnable ();
155+
r[s.settings_scriptUseOptimization ] = scriptUseOptimization ();
156+
r[s.settings_scriptLoopPeriod ] = scriptLoopPeriod ();
156157
r[s.settings_scriptManual ] = scriptManualExecutables();
157158
r[s.settings_scriptDefault ] = scriptDefaultExecutable();
159+
r[s.settings_scriptImportPath ] = scriptImportPath ();
158160
return r;
159161
}
160162

@@ -171,6 +173,7 @@ void mbServer::setCachedSettings(const MBSETTINGS &settings)
171173
it = settings.find(s.settings_scriptLoopPeriod ); if (it != end) setScriptLoopPeriod (it.value().toInt ());
172174
it = settings.find(s.settings_scriptManual ); if (it != end) scriptSetManualExecutables(it.value().toStringList());
173175
it = settings.find(s.settings_scriptDefault ); if (it != end) scriptSetDefaultExecutable(it.value().toString ());
176+
it = settings.find(s.settings_scriptImportPath ); if (it != end) scriptSetImportPath (it.value().toStringList());
174177
}
175178

176179
QString mbServer::scriptDefaultExecutable() const
@@ -185,13 +188,23 @@ QString mbServer::scriptDefaultExecutable() const
185188
return m_defaultExec;
186189
}
187190

188-
void mbServer::scriptSetDefaultExecutable(const QString exec)
191+
void mbServer::scriptSetDefaultExecutable(const QString &exec)
189192
{
190193
if (!m_autoDetectedExec.contains(exec) && !m_manualExec.contains(exec))
191194
scriptAddExecutable(exec);
192195
m_defaultExec = exec;
193196
}
194197

198+
QStringList mbServer::scriptImportPath() const
199+
{
200+
return m_importPath;
201+
}
202+
203+
void mbServer::scriptSetImportPath(const QStringList &pathList)
204+
{
205+
m_importPath = pathList;
206+
}
207+
195208
QString mbServer::createGUID()
196209
{
197210
return Strings::instance().GUID;

src/server/core/server.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class mbServer : public mbCore
5454
const QString settings_scriptLoopPeriod ;
5555
const QString settings_scriptManual ;
5656
const QString settings_scriptDefault ;
57+
const QString settings_scriptImportPath ;
5758
Strings();
5859
static const Strings &instance();
5960
};
@@ -86,9 +87,11 @@ class mbServer : public mbCore
8687
inline QStringList scriptAutoDetectedExecutables() const { return m_autoDetectedExec; }
8788
inline QStringList scriptManualExecutables() const { return m_manualExec; }
8889
inline void scriptSetManualExecutables(const QStringList &exec) { m_manualExec = exec; }
89-
inline void scriptAddExecutable(const QString exec) { m_manualExec.append(exec); }
90+
inline void scriptAddExecutable(const QString &exec) { m_manualExec.append(exec); }
9091
QString scriptDefaultExecutable() const;
91-
void scriptSetDefaultExecutable(const QString exec);
92+
void scriptSetDefaultExecutable(const QString &exec);
93+
QStringList scriptImportPath() const;
94+
void scriptSetImportPath(const QStringList &pathList);
9295

9396
private:
9497
QString createGUID() override;
@@ -104,6 +107,7 @@ class mbServer : public mbCore
104107
QStringList m_autoDetectedExec;
105108
QStringList m_manualExec;
106109
mutable QString m_defaultExec;
110+
QStringList m_importPath;
107111
};
108112

109113
#endif // SERVER_H

src/server/gui/dialogs/settings/server_dialogsettings.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ void mbServerDialogSettings::fillForm(const MBSETTINGS &m)
4848
m_script->setScriptOutputFont (m.value(sout.font ).toString ());
4949
m_script->scriptSetManualExecutables (m.value(ssrv.settings_scriptManual ).toStringList());
5050
m_script->scriptSetDefaultExecutable (m.value(ssrv.settings_scriptDefault ).toString ());
51+
m_script->scriptSetImportPath (m.value(ssrv.settings_scriptImportPath ).toStringList());
5152
}
5253

5354
void mbServerDialogSettings::fillData(MBSETTINGS &m)
@@ -68,5 +69,5 @@ void mbServerDialogSettings::fillData(MBSETTINGS &m)
6869
m[sout.font ] = m_script->scriptOutputFont ();
6970
m[ssrv.settings_scriptManual ] = m_script->scriptManualExecutables ();
7071
m[ssrv.settings_scriptDefault ] = m_script->scriptDefaultExecutable ();
71-
72+
m[ssrv.settings_scriptImportPath ] = m_script->scriptImportPath ();
7273
}

src/server/gui/dialogs/settings/server_widgetsettingsscript.cpp

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include "server_widgetsettingsscript.h"
22
#include "ui_server_widgetsettingsscript.h"
33

4+
#include <QStringListModel>
5+
46
#include <server.h>
57
#include <gui/server_ui.h>
68
#include <gui/dialogs/server_dialogs.h>
@@ -50,6 +52,17 @@ mbServerWidgetSettingsScript::mbServerWidgetSettingsScript(QWidget *parent) :
5052
m_modelInterpreters->setAutoDetected(mbServer::global()->scriptAutoDetectedExecutables());
5153
ui->viewInterpreters->setModel(m_modelInterpreters);
5254

55+
m_modelImportPath = new QStringListModel(this);
56+
ui->viewImportPath->setModel(m_modelImportPath);
57+
ui->viewImportPath->setSelectionMode(QAbstractItemView::ExtendedSelection);
58+
connect(m_modelImportPath, &QAbstractItemModel::dataChanged, this, [this](const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>())
59+
{
60+
QModelIndex newIndex = topLeft;
61+
if (m_modelImportPath->data(newIndex).toString().trimmed().isEmpty())
62+
m_modelImportPath->removeRow(newIndex.row());
63+
64+
});
65+
5366
connect(ui->btnFont , &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotFont );
5467
connect(ui->btnOutputFont , &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotOutputFont );
5568
connect(ui->btnPyAdd , &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotPyAdd );
@@ -58,6 +71,13 @@ mbServerWidgetSettingsScript::mbServerWidgetSettingsScript(QWidget *parent) :
5871
connect(ui->btnPyMakeDefault, &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotPyMakeDefault);
5972
connect(ui->btnPyClear , &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotPyClear );
6073
connect(ui->btnPyBrowse , &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotPyBrowse );
74+
connect(ui->btnImportAdd , &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotImportAdd );
75+
connect(ui->btnImportBrowse , &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotImportBrowse );
76+
connect(ui->btnImportRemove , &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotImportRemove );
77+
connect(ui->btnImportClear , &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotImportClear );
78+
connect(ui->btnImportUp , &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotImportUp );
79+
connect(ui->btnImportDown , &QPushButton::clicked, this, &mbServerWidgetSettingsScript::slotImportDown );
80+
6181

6282
QItemSelectionModel *sm = ui->viewInterpreters->selectionModel();
6383
connect(sm, &QItemSelectionModel::selectionChanged, this, &mbServerWidgetSettingsScript::selectionChanged);
@@ -195,6 +215,16 @@ void mbServerWidgetSettingsScript::scriptSetDefaultExecutable(const QString &exe
195215
m_modelInterpreters->scriptSetDefaultExecutable(exec);
196216
}
197217

218+
QStringList mbServerWidgetSettingsScript::scriptImportPath() const
219+
{
220+
return m_modelImportPath->stringList();
221+
}
222+
223+
void mbServerWidgetSettingsScript::scriptSetImportPath(const QStringList &path)
224+
{
225+
m_modelImportPath->setStringList(path);
226+
}
227+
198228
QFont mbServerWidgetSettingsScript::getScriptEditorFont() const
199229
{
200230
QFont f = ui->cmbFontFamily->currentFont();
@@ -293,6 +323,123 @@ void mbServerWidgetSettingsScript::slotPyBrowse()
293323
ui->lnExecPath->setText(s);
294324
}
295325

326+
void mbServerWidgetSettingsScript::slotImportAdd()
327+
{
328+
m_modelImportPath->insertRows(m_modelImportPath->rowCount(), 1);
329+
QModelIndex newIndex = m_modelImportPath->index(m_modelImportPath->rowCount() - 1);
330+
ui->viewImportPath->edit(newIndex);
331+
}
332+
333+
void mbServerWidgetSettingsScript::slotImportBrowse()
334+
{
335+
QString s = mbServer::global()->ui()->dialogs()->getExistingDirectory(this, "Browse Import Path");
336+
if (s.count())
337+
{
338+
m_modelImportPath->insertRows(m_modelImportPath->rowCount(), 1);
339+
QModelIndex newIndex = m_modelImportPath->index(m_modelImportPath->rowCount() - 1);
340+
m_modelImportPath->setData(newIndex, s);
341+
}
342+
}
343+
344+
void mbServerWidgetSettingsScript::slotImportRemove()
345+
{
346+
QItemSelectionModel *sel = ui->viewImportPath->selectionModel();
347+
QModelIndexList selected = sel->selectedIndexes();
348+
std::sort(selected.begin(), selected.end(), [](const QModelIndex &a, const QModelIndex &b) { return a.row() > b.row(); });
349+
Q_FOREACH (const QModelIndex &index, selected)
350+
{
351+
m_modelImportPath->removeRow(index.row());
352+
}
353+
}
354+
355+
void mbServerWidgetSettingsScript::slotImportClear()
356+
{
357+
m_modelImportPath->removeRows(0, m_modelImportPath->rowCount());
358+
}
359+
360+
void mbServerWidgetSettingsScript::slotImportUp()
361+
{
362+
QItemSelectionModel *sel = ui->viewImportPath->selectionModel();
363+
QModelIndexList selected = sel->selectedIndexes();
364+
if (selected.isEmpty())
365+
return;
366+
367+
// Sort by row ascending
368+
std::sort(selected.begin(), selected.end(), [](const QModelIndex &a, const QModelIndex &b) { return a.row() < b.row(); });
369+
370+
QStringList list = m_modelImportPath->stringList();
371+
bool changed = false;
372+
373+
Q_FOREACH (const QModelIndex &index, selected)
374+
{
375+
int row = index.row();
376+
if (row > 0)
377+
{
378+
list.swapItemsAt(row, row - 1);
379+
changed = true;
380+
}
381+
}
382+
383+
if (changed)
384+
{
385+
m_modelImportPath->setStringList(list);
386+
387+
// Reselect moved items
388+
QItemSelection newSelection;
389+
Q_FOREACH (const QModelIndex &index, selected)
390+
{
391+
int row = index.row();
392+
if (row > 0)
393+
newSelection.select(m_modelImportPath->index(row - 1), m_modelImportPath->index(row - 1));
394+
else
395+
newSelection.select(m_modelImportPath->index(row), m_modelImportPath->index(row));
396+
}
397+
sel->select(newSelection, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
398+
}
399+
}
400+
401+
void mbServerWidgetSettingsScript::slotImportDown()
402+
{
403+
QItemSelectionModel *sel = ui->viewImportPath->selectionModel();
404+
QModelIndexList selected = sel->selectedIndexes();
405+
if (selected.isEmpty())
406+
return;
407+
408+
// Sort by row descending
409+
std::sort(selected.begin(), selected.end(), [](const QModelIndex &a, const QModelIndex &b) { return a.row() > b.row(); });
410+
411+
QStringList list = m_modelImportPath->stringList();
412+
bool changed = false;
413+
int rowCount = list.size();
414+
415+
Q_FOREACH (const QModelIndex &index, selected)
416+
{
417+
int row = index.row();
418+
if (row < rowCount - 1)
419+
{
420+
list.swapItemsAt(row, row + 1);
421+
changed = true;
422+
}
423+
}
424+
425+
if (changed)
426+
{
427+
m_modelImportPath->setStringList(list);
428+
429+
// Reselect moved items
430+
QItemSelection newSelection;
431+
Q_FOREACH (const QModelIndex &index, selected)
432+
{
433+
int row = index.row();
434+
if (row < rowCount - 1)
435+
newSelection.select(m_modelImportPath->index(row + 1), m_modelImportPath->index(row + 1));
436+
else
437+
newSelection.select(m_modelImportPath->index(row), m_modelImportPath->index(row));
438+
}
439+
sel->select(newSelection, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
440+
}
441+
}
442+
296443
void mbServerWidgetSettingsScript::selectionChanged(const QItemSelection &selected, const QItemSelection &)
297444
{
298445
QModelIndexList ls = selected.indexes();

src/server/gui/dialogs/settings/server_widgetsettingsscript.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <QWidget>
55

66
class QItemSelection;
7+
class QStringListModel;
78

89
namespace Ui {
910
class mbServerWidgetSettingsScript;
@@ -57,6 +58,9 @@ class mbServerWidgetSettingsScript : public QWidget
5758
QString scriptDefaultExecutable() const;
5859
void scriptSetDefaultExecutable(const QString &exec);
5960

61+
QStringList scriptImportPath() const;
62+
void scriptSetImportPath(const QStringList &path);
63+
6064
private:
6165
QFont getScriptEditorFont() const;
6266
void setScriptEditorFont(const QFont &f);
@@ -72,12 +76,19 @@ private Q_SLOTS:
7276
void slotPyMakeDefault();
7377
void slotPyClear ();
7478
void slotPyBrowse ();
75-
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
79+
void slotImportAdd ();
80+
void slotImportBrowse ();
81+
void slotImportRemove ();
82+
void slotImportClear ();
83+
void slotImportUp ();
84+
void slotImportDown ();
85+
void selectionChanged (const QItemSelection &selected, const QItemSelection &deselected);
7686

7787
private:
7888
Ui::mbServerWidgetSettingsScript *ui;
7989
mbServerModelSettingsScriptEditorColors *m_modelEditorColors;
8090
mbServerModelSettingsScriptInterpreters *m_modelInterpreters;
91+
QStringListModel *m_modelImportPath;
8192
};
8293

8394
#endif // SERVER_WIDGETSETTINGSSCRIPT_H

0 commit comments

Comments
 (0)