19constexpr int kGeneralCategory = 0;
20constexpr int kImportCategory = 1;
21constexpr int kExportCategory = 2;
22constexpr int kMiscellaneousCategory = 3;
24QVariantMap categoryRow(
int value,
const QString&
text,
bool selected) {
25 return {{QStringLiteral(
"category"), value},
26 {QStringLiteral(
"text"),
text},
27 {QStringLiteral(
"selected"), selected}};
30QString languageCode(
const QVariant& value) {
31 return value.toMap().value(QStringLiteral(
"code")).toString();
34bool languageAvailable(
const QVariant& value) {
35 const QVariantMap map = value.toMap();
36 return !map.contains(QStringLiteral(
"available")) ||
37 map.value(QStringLiteral(
"available")).toBool();
40QVariantMap themeModeOption(
const QString& code,
const QString& label) {
41 return {{QStringLiteral(
"code"), code}, {QStringLiteral(
"label"), label}};
44QString themeModeCode(
const QVariant& value) {
45 return value.toMap().value(QStringLiteral(
"code")).toString();
48int autosaveIntervalMinutes(
const QVariant& value) {
49 return value.toMap().value(QStringLiteral(
"minutes")).toInt();
52QVariantMap autosaveIntervalOption(
int minutes,
const QString& label) {
53 return {{QStringLiteral(
"minutes"), minutes},
54 {QStringLiteral(
"label"), label}};
62 if (navigation_ == value) {
65 bindNavigation(value);
70 if (settings_ == value) {
78 if (actions_ == value) {
86 if (languageService_ == value) {
89 if (languageService_) {
90 disconnect(languageService_,
nullptr,
this,
nullptr);
92 languageService_ = value;
93 if (languageService_) {
95 &SettingsViewModel::emitChanged);
97 &SettingsViewModel::emitChanged);
102void SettingsViewModel::bindNavigation(
Navigation* value) {
104 disconnect(navigation_,
nullptr,
this,
nullptr);
109 &SettingsViewModel::emitChanged);
113void SettingsViewModel::bindSettings(
Settings* value) {
115 disconnect(settings_,
nullptr,
this,
nullptr);
120 &SettingsViewModel::emitChanged);
122 &SettingsViewModel::emitChanged);
124 &SettingsViewModel::emitChanged);
128void SettingsViewModel::bindActions(
Actions* value) {
130 disconnect(actions_,
nullptr,
this,
nullptr);
137 [
this](
const QString& path) {
138 if (!path.isEmpty()) {
143 [
this](
const QStringList& paths) {
144 if (!paths.isEmpty() && !paths.first().isEmpty()) {
149 [
this](
const QString& path) {
150 if (!path.isEmpty()) {
156void SettingsViewModel::emitChanged() {
161 return navigation_ ? navigation_->settingsCategoryValue() : firstCategory();
167 categoryRow(kGeneralCategory, tr(
"General"),
168 selected == kGeneralCategory),
169 categoryRow(kImportCategory, tr(
"Import"), selected == kImportCategory),
170 categoryRow(kExportCategory, tr(
"Export"), selected == kExportCategory),
171 categoryRow(kMiscellaneousCategory, tr(
"Miscellaneous"),
172 selected == kMiscellaneousCategory)};
176 return lastCategory() > firstCategory();
190 const int first = firstCategory();
191 const int last = lastCategory();
192 const int total = last - first + 1;
193 if (!navigation_ || total <= 0) {
197 const int next = first + ((offset + delta + total) % total);
203 navigation_->setSettingsCategoryValue(category);
210 settings_->resetToDefaults();
215int SettingsViewModel::firstCategory() const noexcept {
216 return kGeneralCategory;
219int SettingsViewModel::lastCategory() const noexcept {
220 return kMiscellaneousCategory;
224 return languageService_ ? languageService_->availableLanguages()
229 const QString selectedLanguage =
language();
231 for (
int i = 0; i < options.size(); ++i) {
232 if (languageCode(options.at(i)) == selectedLanguage) {
240 return {themeModeOption(QStringLiteral(
"light"), tr(
"Light")),
241 themeModeOption(QStringLiteral(
"dark"), tr(
"Dark"))};
245 const QString selectedThemeMode =
themeMode();
247 for (
int i = 0; i < options.size(); ++i) {
248 if (themeModeCode(options.at(i)) == selectedThemeMode) {
257 return settings_->language();
259 return languageService_ ? languageService_->currentLanguage() : QString();
264 settings_->setLanguage(value);
266 if (languageService_) {
267 languageService_->applyLanguage(value);
272 return settings_ ? settings_->themeMode() : QStringLiteral(
"light");
277 settings_->setThemeMode(value);
283 if (index < 0 || index >= options.size() ||
284 !languageAvailable(options.at(index))) {
293 if (index < 0 || index >= options.size()) {
301 return !settings_ || settings_->autosaveOnClose();
306 settings_->setAutosaveOnClose(value);
313 tr(
"Every 1 minute")),
315 tr(
"Every 5 minutes")),
317 tr(
"Every 10 minutes")),
319 tr(
"Every 15 minutes")),
321 tr(
"Every 30 minutes"))};
325 const int selectedMinutes = settings_ ? settings_->autosaveIntervalMinutes()
328 for (
int i = 0; i < options.size(); ++i) {
329 if (autosaveIntervalMinutes(options.at(i)) == selectedMinutes) {
338 if (!settings_ || index < 0 || index >= options.size()) {
342 settings_->setAutosaveIntervalMinutes(
343 autosaveIntervalMinutes(options.at(index)));
347 return settings_ ? settings_->importDefaultPath() : QString();
352 settings_->setImportDefaultPath(value);
357 return settings_ ? settings_->importPoppler() : QString();
362 settings_->setImportPoppler(value);
367 return settings_ ? settings_->importOpenCv() : QString();
372 settings_->setImportOpenCv(value);
377 return settings_ ? settings_->importTesseract() : QString();
382 settings_->setImportTesseract(value);
387 return settings_ ? settings_->importParser() : QString();
392 settings_->setImportParser(value);
397 return settings_ ? settings_->importMatcher() : QString();
402 settings_->setImportMatcher(value);
407 return settings_ ? settings_->exportDefaultDirectory() : QString();
412 settings_->setExportDefaultDirectory(value);
417 return settings_ ? settings_->exportArchiveFormat() : 0;
422 settings_->setExportArchiveFormat(value);
427 return !settings_ || settings_->exportIncludeFormulas();
432 settings_->setExportIncludeFormulas(value);
437 return !settings_ || settings_->toolbarShowBooking();
442 settings_->setToolbarShowBooking(value);
447 return !settings_ || settings_->toolbarShowImport();
452 settings_->setToolbarShowImport(value);
457 return !settings_ || settings_->toolbarShowActors();
462 settings_->setToolbarShowActors(value);
467 return !settings_ || settings_->toolbarShowExport();
472 settings_->setToolbarShowExport(value);
477 return !settings_ || settings_->toolbarShowProperties();
482 settings_->setToolbarShowProperties(value);
487 return !settings_ || settings_->toolbarShowAnalysis();
492 settings_->setToolbarShowAnalysis(value);
497 return !settings_ || settings_->toolbarShowContracts();
502 settings_->setToolbarShowContracts(value);
507 return !settings_ || settings_->toolbarShowAnnual();
512 settings_->setToolbarShowAnnual(value);
517 return !settings_ || settings_->toolbarShowSettings();
522 settings_->setToolbarShowSettings(value);
528 "Settings save submitted");
532 if (languageService_ && settings_) {
533 languageService_->applyLanguage(settings_->language());
540 actions_->browseImportPdf();
546 actions_->browseExportDirectory();
Declares QAction wrappers exposed to the UI layer and QML.
Defines UI-specific runtime constants that are not shared with core.
Declares the UI service responsible for runtime language switching.
Declarations for the UI Navigation component.
Declares the centralized UI settings view model exposed to QML.
Declares the Settings page view model.
Declarations for the UI Trace component.
Owns the main window actions and exposes them to QML.
void importFileSelected(const QString &path)
Emitted after a single import file was selected by the user.
void exportDirectorySelected(const QString &path)
Emitted after an export directory was chosen by the user.
void importFilesSelected(const QStringList &paths)
Emitted after multiple import files were selected by the user.
Manages the active UI language and the available translation options.
void availableLanguagesChanged()
Emitted when the available language list changes.
void currentLanguageChanged()
Emitted when the active language changes.
Stores the active top-level shell section and settings sub-section.
void settingsCategoryChanged()
Emitted when the active settings category changes.
Stores and exposes globally persisted UI settings for settings-related views.
void stateChanged()
Emitted when any settings value changes.
Q_INVOKABLE void selectAutosaveIntervalAt(int index)
Selects an autosave interval option by index.
void setToolbarShowActors(bool value)
Updates whether the actor toolbar entry is visible.
int autosaveIntervalIndex
void setToolbarShowAnnual(bool value)
Updates whether the annual toolbar entry is visible.
void setAutosaveOnClose(bool value)
Updates whether autosave on close is enabled.
void setLanguageService(LanguageService *value)
Sets the language service used to build language options.
void setImportDefaultPath(const QString &value)
Updates the default import path.
QString exportDefaultDirectory
void setToolbarShowProperties(bool value)
Updates whether the property toolbar entry is visible.
void setNavigation(Navigation *value)
Sets the shell navigation object used by the settings page.
Q_INVOKABLE void saveSettings()
Persists the current settings values.
void setExportDefaultDirectory(const QString &value)
Updates the default export directory.
void setToolbarShowSettings(bool value)
Updates whether the settings toolbar entry is visible.
void setLanguage(const QString &value)
Updates the configured language code.
QVariantList categoryRows
QString importDefaultPath
void setToolbarShowImport(bool value)
Updates whether the import toolbar entry is visible.
void setThemeMode(const QString &value)
Updates the configured theme mode.
SettingsViewModel(QObject *parent=nullptr)
Creates the settings view model.
void changed()
Emitted when settings view model state changed.
void setImportParser(const QString &value)
Updates the configured import parser key.
bool toolbarShowContracts
bool toolbarShowProperties
Q_INVOKABLE void selectCategory(int category)
Selects a settings category.
void setToolbarShowExport(bool value)
Updates whether the export toolbar entry is visible.
QVariantList themeModeOptions
void setExportIncludeFormulas(bool value)
Updates whether exported spreadsheets include formulas.
void setToolbarShowContracts(bool value)
Updates whether the contract toolbar entry is visible.
void setImportTesseract(const QString &value)
Updates the configured Tesseract path.
QVariantList autosaveIntervalOptions
Q_INVOKABLE void selectLanguageAt(int index)
Selects a language option by index.
void setImportMatcher(const QString &value)
Updates the configured import matcher key.
void setToolbarShowAnalysis(bool value)
Updates whether the analysis toolbar entry is visible.
Q_INVOKABLE void browseExportDirectory()
Opens a browser for the export default directory.
Q_INVOKABLE void selectThemeModeAt(int index)
Selects a theme mode option by index.
Q_INVOKABLE void browseImportPath()
Opens a browser for the import default path.
void setImportOpenCv(const QString &value)
Updates the configured OpenCV path.
Q_INVOKABLE void resetSettings()
Resets settings values to defaults.
void setImportPoppler(const QString &value)
Updates the configured Poppler path.
bool canNavigateCategories
void setExportArchiveFormat(int value)
Updates the configured export archive format index.
void setToolbarShowBooking(bool value)
Updates whether the booking toolbar entry is visible.
void setSettings(Settings *value)
Sets the settings state object used for persisted settings values.
Q_INVOKABLE void activate()
Activates the settings page state.
Q_INVOKABLE void navigateCategory(int delta)
Navigates settings categories by a relative delta.
void setActions(Actions *value)
Sets shell actions used for file browsing.
bool exportIncludeFormulas
QVariantList languageOptions
constexpr int kInterval5Minutes
constexpr int kIntervalOff
Allowed periodic autosave intervals in minutes; 0 means disabled.
constexpr int kInterval15Minutes
constexpr int kInterval1Minute
constexpr int kInterval30Minutes
constexpr int kInterval10Minutes
void traceViewModel(const char *origin, std::string message, core::errors::ErrorContext context={})
Emits a view model trace event.