diff --git a/src/blackgui/components/dbstashcomponent.cpp b/src/blackgui/components/dbstashcomponent.cpp index cbef03d42..d17dd3be8 100644 --- a/src/blackgui/components/dbstashcomponent.cpp +++ b/src/blackgui/components/dbstashcomponent.cpp @@ -7,23 +7,22 @@ * contained in the LICENSE file. */ +#include "blackgui/components/dbmappingcomponent.h" +#include "blackgui/components/dbstashcomponent.h" +#include "blackgui/views/aircraftmodelview.h" +#include "blackgui/views/viewbase.h" +#include "blackgui/guiapplication.h" +#include "blackgui/models/aircraftmodellistmodel.h" #include "blackcore/db/databasewriter.h" #include "blackcore/db/databaseutils.h" #include "blackcore/application.h" #include "blackcore/webdataservices.h" -#include "blackgui/components/dbmappingcomponent.h" -#include "blackgui/components/dbstashcomponent.h" -#include "blackgui/guiapplication.h" -#include "blackgui/models/aircraftmodellistmodel.h" -#include "blackgui/views/aircraftmodelview.h" -#include "blackgui/views/viewbase.h" -#include "blackmisc/aviation/aircrafticaocode.h" -#include "blackmisc/aviation/livery.h" -#include "blackmisc/logcategory.h" -#include "blackmisc/logcategorylist.h" -#include "blackmisc/sequence.h" #include "blackmisc/simulation/aircraftmodel.h" #include "blackmisc/simulation/distributorlist.h" +#include "blackmisc/aviation/aircrafticaocode.h" +#include "blackmisc/aviation/livery.h" +#include "blackmisc/logcategorylist.h" +#include "blackmisc/sequence.h" #include "blackmisc/verify.h" #include "dbstashcomponent.h" #include "ui_dbstashcomponent.h" @@ -78,6 +77,7 @@ namespace BlackGui ui->tvp_StashAircraftModels->menuAddItems(CAircraftModelView::MenuRemoveSelectedRows); ui->tvp_StashAircraftModels->setHighlightModelStrings(true); ui->tvp_StashAircraftModels->setHighlightModelStringsColor(Qt::red); + ui->tvp_StashAircraftModels->setSettingsDirectoryIndex(CDirectories::IndexDirLastModelStashJsonOrDefault); this->enableButtonRow(); connect(sApp->getWebDataServices()->getDatabaseWriter(), &CDatabaseWriter::publishedModels, this, &CDbStashComponent::onPublishedModelsResponse, Qt::QueuedConnection); diff --git a/src/blackgui/components/flightplancomponent.cpp b/src/blackgui/components/flightplancomponent.cpp index 3f9092958..353327b99 100644 --- a/src/blackgui/components/flightplancomponent.cpp +++ b/src/blackgui/components/flightplancomponent.cpp @@ -7,25 +7,25 @@ * contained in the LICENSE file. */ -#include "blackcore/context/contextnetwork.h" -#include "blackcore/context/contextownaircraft.h" -#include "blackcore/context/contextsimulator.h" -#include "blackcore/webdataservices.h" #include "blackgui/uppercasevalidator.h" #include "blackgui/components/flightplancomponent.h" #include "blackgui/components/selcalcodeselector.h" #include "blackgui/guiapplication.h" +#include "blackcore/context/contextnetwork.h" +#include "blackcore/context/contextownaircraft.h" +#include "blackcore/context/contextsimulator.h" +#include "blackcore/webdataservices.h" #include "blackmisc/aviation/aircrafticaocode.h" #include "blackmisc/aviation/airportlist.h" #include "blackmisc/aviation/altitude.h" #include "blackmisc/aviation/callsign.h" +#include "blackmisc/pq/pqstring.h" +#include "blackmisc/pq/speed.h" +#include "blackmisc/pq/units.h" #include "blackmisc/logcategory.h" #include "blackmisc/logmessage.h" #include "blackconfig/buildconfig.h" #include "blackmisc/network/user.h" -#include "blackmisc/pq/pqstring.h" -#include "blackmisc/pq/speed.h" -#include "blackmisc/pq/units.h" #include "blackmisc/simulation/simulatedaircraft.h" #include "blackmisc/directoryutils.h" #include "blackmisc/statusmessage.h" @@ -43,6 +43,7 @@ #include #include #include +#include #include using namespace BlackMisc; @@ -502,6 +503,7 @@ namespace BlackGui { const CFlightPlan fp = variant.value(); this->fillWithFlightPlanData(fp); + this->updateDirectorySettings(fileName); } else { @@ -539,6 +541,7 @@ namespace BlackGui if (ok) { m = CStatusMessage(this, CStatusMessage::SeverityInfo, "Written " + fileName, true); + this->updateDirectorySettings(fileName); } else { @@ -551,8 +554,8 @@ namespace BlackGui void CFlightPlanComponent::setSelcalInOwnAircraft() { - if (!sGui->getIContextOwnAircraft()) return; - if (!ui->frp_SelcalCode->hasValidCode()) return; + if (!sGui || !sGui->getIContextOwnAircraft()) { return; } + if (!ui->frp_SelcalCode->hasValidCode()) { return; } sGui->getIContextOwnAircraft()->updateSelcal(ui->frp_SelcalCode->getSelcal(), flightPlanIdentifier()); } @@ -802,6 +805,16 @@ namespace BlackGui } } + void CFlightPlanComponent::updateDirectorySettings(const QString &fileOrDirectory) + { + if (fileOrDirectory.isEmpty()) { return; } + + CDirectories swiftDirs = m_directories.get(); + swiftDirs.setFlightPlanDirectory(CDirectories::fileNameToDirectory(fileOrDirectory)); + CStatusMessage saveMsg = m_directories.setAndSave(swiftDirs); + CLogMessage::preformatted(saveMsg); + } + void CFlightPlanComponent::initCompleters() { if (!sGui || !sGui->hasWebDataServices()) { return; } @@ -818,7 +831,7 @@ namespace BlackGui QString CFlightPlanComponent::getDefaultFilename(bool load) { // some logic to find a useful default name - const QString dir = CDirectoryUtils::documentationDirectory(); + const QString dir = m_directories.get().getFlightPlanDirectoryOrDefault(); if (load) { return CFileUtils::appendFilePaths(dir, CFileUtils::jsonWildcardAppendix()); } // Save file path diff --git a/src/blackgui/components/flightplancomponent.h b/src/blackgui/components/flightplancomponent.h index 4628e849b..4561053cf 100644 --- a/src/blackgui/components/flightplancomponent.h +++ b/src/blackgui/components/flightplancomponent.h @@ -19,6 +19,8 @@ #include "blackmisc/aviation/flightplan.h" #include "blackmisc/network/data/lastserver.h" #include "blackmisc/network/user.h" +#include "blackmisc/directories.h" +#include "blackmisc/settingscache.h" #include "blackmisc/datacache.h" #include "blackmisc/identifier.h" #include "blackmisc/statusmessagelist.h" @@ -65,6 +67,7 @@ namespace BlackGui BlackMisc::Aviation::CFlightPlan m_sentFlightPlan; //!< My flight plan BlackMisc::Simulation::CAircraftModel m_model; //!< currently used model BlackMisc::CIdentifier m_identifier { "FlightPlanComponent", this }; //!< Flightplan identifier + BlackMisc::CSetting m_directories { this }; //!< the swift directories BlackMisc::CDataReadOnly m_lastAircraftModel { this }; //!< recently used aircraft model BlackMisc::CDataReadOnly m_lastServer { this }; //!< recently used server (VATSIM, other) @@ -171,6 +174,9 @@ namespace BlackGui //! Guess some FP values/setting void anticipateValues(); + + //! Update the diretcory settings + void updateDirectorySettings(const QString &fileOrDirectory); }; } // ns } // ns diff --git a/src/blackgui/views/aircraftmodelview.cpp b/src/blackgui/views/aircraftmodelview.cpp index 2cc237859..740baea8b 100644 --- a/src/blackgui/views/aircraftmodelview.cpp +++ b/src/blackgui/views/aircraftmodelview.cpp @@ -8,22 +8,23 @@ */ #include "blackgui/filters/aircraftmodelfilterdialog.h" -#include "blackgui/guiapplication.h" -#include "blackgui/guiutility.h" -#include "blackgui/menus/menuaction.h" -#include "blackgui/shortcut.h" #include "blackgui/views/aircraftmodelview.h" #include "blackgui/views/viewbase.h" +#include "blackgui/menus/menuaction.h" +#include "blackgui/guiapplication.h" +#include "blackgui/guiutility.h" +#include "blackgui/shortcut.h" +#include "blackmisc/simulation/aircraftmodel.h" +#include "blackmisc/simulation/distributorlist.h" +#include "blackmisc/simulation/simulatorinfolist.h" #include "blackmisc/aviation/aircrafticaocode.h" #include "blackmisc/aviation/aircrafticaocodelist.h" #include "blackmisc/aviation/airlineicaocodelist.h" #include "blackmisc/aviation/livery.h" #include "blackmisc/aviation/liverylist.h" -#include "blackmisc/icons.h" -#include "blackmisc/simulation/aircraftmodel.h" -#include "blackmisc/simulation/distributorlist.h" -#include "blackmisc/simulation/simulatorinfolist.h" +#include "blackmisc/directories.h" #include "blackmisc/statusmessagelist.h" +#include "blackmisc/icons.h" #include "blackmisc/variant.h" #include @@ -49,6 +50,7 @@ namespace BlackGui { // default this->standardInit(new CAircraftModelListModel(CAircraftModelListModel::OwnAircraftModelClient, this)); + this->setSettingsDirectoryIndex(CDirectories::IndexDirLastModelJsonOrDefault); // shortcut QShortcut *stashShortcut = new QShortcut(CShortcut::keyStash(), this); diff --git a/src/blackgui/views/aircraftmodelview.h b/src/blackgui/views/aircraftmodelview.h index 0ff74989e..3f347ffb5 100644 --- a/src/blackgui/views/aircraftmodelview.h +++ b/src/blackgui/views/aircraftmodelview.h @@ -30,7 +30,6 @@ #include class QDropEvent; -class QWidget; namespace BlackMisc { diff --git a/src/blackgui/views/viewbase.cpp b/src/blackgui/views/viewbase.cpp index db13d7887..d2aeecf3a 100644 --- a/src/blackgui/views/viewbase.cpp +++ b/src/blackgui/views/viewbase.cpp @@ -317,24 +317,21 @@ namespace BlackGui void CViewBaseNonTemplate::rememberLastJsonDirectory(const QString &selectedFileOrDir) { if (selectedFileOrDir.isEmpty()) { return; } - const QFileInfo fi(selectedFileOrDir); - if ((fi.isDir() && fi.exists()) || (fi.isFile() && fi.exists())) - { - // existing dir - m_lastJsonDirectory = fi.absolutePath(); - } + const QString dir = CDirectories::fileNameToDirectory(selectedFileOrDir); + QDir d(dir); + if (!d.exists()) { return; } + + // existing dir + CDirectories directories = m_dirSettings.get(); + directories.setPropertyByIndex(m_dirSettingsIndex, CVariant::fromValue(dir)); + const CStatusMessage msg = m_dirSettings.setAndSave(directories); + CLogMessage::preformatted(msg); } QString CViewBaseNonTemplate::getRememberedLastJsonDirectory() const { - if (!m_lastJsonDirectory.isEmpty()) { return m_lastJsonDirectory; } - QString dirCandidate = m_dirSettings.get(); - const QFileInfo fi(dirCandidate); - if ((fi.isDir() && fi.exists()) || (fi.isFile() && fi.exists())) - { - return fi.absolutePath(); - } - return QStringLiteral(""); + const CDirectories directories = m_dirSettings.get(); + return directories.propertyByIndex(m_dirSettingsIndex).toQString(); } void CViewBaseNonTemplate::customMenu(CMenuActions &menuActions) @@ -567,7 +564,7 @@ namespace BlackGui } // Save file path - const QString dir = m_dirSettings.get(); + const QString dir = m_dirSettings.get().propertyByIndex(m_dirSettingsIndex).toQString(); QString name(m_saveFileName); if (name.isEmpty()) { @@ -1538,8 +1535,6 @@ namespace BlackGui break; } - this->rememberLastJsonDirectory(fileName); - try { const bool allowCacheFormat = this->allowCacheFileFormatJson(); @@ -1567,6 +1562,7 @@ namespace BlackGui this->updateContainerMaybeAsync(container); m = CStatusMessage(this, CStatusMessage::SeverityInfo, "Reading " + fileName + " completed", true); this->jsonLoadedAndModelUpdated(container); + this->rememberLastJsonDirectory(fileName); } catch (const CJsonException &ex) { @@ -1598,16 +1594,9 @@ namespace BlackGui if (fileName.isEmpty()) { return CStatusMessage(this, CStatusMessage::SeverityDebug, "Save canceled", true); } const QString json(this->toJsonString()); // save as CVariant JSON - // keep directory for settings - const QFileInfo file(fileName); - const QDir fileDir(file.absoluteDir()); - if (fileDir.exists()) - { - m_dirSettings.setAndSave(fileDir.absolutePath()); - } - // save file const bool ok = CFileUtils::writeStringToFileInBackground(json, fileName); + if (ok) { this->rememberLastJsonDirectory(fileName); } return ok ? CStatusMessage(this, CStatusMessage::SeverityInfo, "Writing " + fileName + " in progress", true) : CStatusMessage(this, CStatusMessage::SeverityError, "Writing " + fileName + " failed", true); diff --git a/src/blackgui/views/viewbase.h b/src/blackgui/views/viewbase.h index 7bfa3e0b8..803fe0a0b 100644 --- a/src/blackgui/views/viewbase.h +++ b/src/blackgui/views/viewbase.h @@ -16,14 +16,14 @@ #include "blackgui/models/modelfilter.h" #include "blackgui/models/selectionmodel.h" #include "blackgui/settings/guisettings.h" -#include "blackgui/settings/viewdirectorysettings.h" #include "blackgui/menus/menuaction.h" +#include "blackgui/blackguiexport.h" #include "blackmisc/namevariantpairlist.h" -#include "blackmisc/propertyindex.h" -#include "blackmisc/propertyindexvariantmap.h" +#include "blackmisc/directories.h" #include "blackmisc/statusmessage.h" #include "blackmisc/variant.h" -#include "blackgui/blackguiexport.h" +#include "blackmisc/propertyindexvariantmap.h" +#include "blackmisc/propertyindex.h" #include #include @@ -287,6 +287,9 @@ namespace BlackGui //! Workaround as of https://stackoverflow.com/q/3433664/356726 void setForceColumnsToMaxSize(bool force) { m_forceColumnsToMaxSize = force; } + //! Index of the directory we "remember" + void setSettingsDirectoryIndex(BlackMisc::CDirectories::ColumnIndex directoryIndex) { m_dirSettingsIndex = directoryIndex; } + signals: //! Ask for new data from currently loaded data void requestUpdate(); @@ -498,8 +501,8 @@ namespace BlackGui CLoadIndicator *m_loadIndicator = nullptr; //!< load indicator if needed QMap m_menuFlagActions; //!< initialized actions QString m_saveFileName; //!< save file name (JSON) - QString m_lastJsonDirectory; //!< remember last JSON directory - BlackMisc::CSetting m_dirSettings { this }; //!< directory for load/save + BlackMisc::CDirectories::ColumnIndex m_dirSettingsIndex = BlackMisc::CDirectories::IndexDirLastViewJsonOrDefault; //!< allows to set more specialized directories //!< remember last JSON directory, having this member allows to have specific dir + BlackMisc::CSetting m_dirSettings { this }; //!< directory for load/save BlackMisc::CSettingReadOnly m_guiSettings { this, &CViewBaseNonTemplate::settingsChanged }; //!< general GUI settings protected slots: