Mercurial > octave
comparison libgui/src/files-dock-widget.cc @ 31619:ad014fc78bd6
use individual local gui_settings objects
Previously, we created a single gui_settings object (derived from
QSettings) and accessed it from the resource_manager object. That
design is not necessary and is not the way QSettings was designed to
be used. Instead of managing a single object, we should be using
individual QSettings objects where needed. Each individual QSettings
object manages thread-safe access to a single global collection of
settings. The Qt docs say that operations on QSettings are not thread
safe, but that means that you can't create a QSettings object in one
thread and use it in another without some locking. I'm not sure
whether we were doing that correctly, but with this change it no
longer matters. Each QSettings object does perform locking when
reading or writing the underlying global data.
* resource-manager.h, resource-manager.cc
(resource_manager::m_settings): Delete data member.
(resource_manager::get_settings): Delete.
* annotation-dialog.cc, QTerminal.cc, QTerminal.h, command-widget.cc,
command-widget.h, community-news.cc, dialog.cc,
documentation-bookmarks.cc, documentation-bookmarks.h,
documentation-dock-widget.cc, documentation-dock-widget.h,
documentation.cc, documentation.h, dw-main-window.cc,
dw-main-window.h, external-editor-interface.cc, files-dock-widget.cc,
files-dock-widget.h, find-files-dialog.cc, history-dock-widget.cc,
history-dock-widget.h, file-editor-interface.h, file-editor-tab.cc,
file-editor-tab.h, file-editor.cc, file-editor.h, find-dialog.cc,
octave-qscintilla.cc, main-window.cc, main-window.h, news-reader.cc,
octave-dock-widget.cc, octave-dock-widget.h, qt-interpreter-events.cc,
qt-interpreter-events.h, release-notes.cc, resource-manager.cc,
resource-manager.h, set-path-dialog.cc, settings-dialog.cc,
settings-dialog.h, shortcut-manager.cc, shortcut-manager.h,
terminal-dock-widget.cc, terminal-dock-widget.h, variable-editor.cc,
variable-editor.h, welcome-wizard.cc, workspace-model.cc,
workspace-model.h, workspace-view.cc: Use local gui_settings objects
instead of accessing a pointer to a single gui_settings object owned
by the resource_manager object.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 02 Dec 2022 14:23:53 -0500 |
parents | 4869dc33405a |
children | 0645ea65ca6b |
comparison
equal
deleted
inserted
replaced
31618:cd833a9baaa7 | 31619:ad014fc78bd6 |
---|---|
47 #include <QUrl> | 47 #include <QUrl> |
48 | 48 |
49 #include "files-dock-widget.h" | 49 #include "files-dock-widget.h" |
50 #include "gui-preferences-fb.h" | 50 #include "gui-preferences-fb.h" |
51 #include "gui-preferences-global.h" | 51 #include "gui-preferences-global.h" |
52 #include "gui-settings.h" | |
52 #include "octave-qobject.h" | 53 #include "octave-qobject.h" |
53 #include "octave-qtutils.h" | 54 #include "octave-qtutils.h" |
54 #include "qt-interpreter-events.h" | 55 #include "qt-interpreter-events.h" |
55 | 56 |
56 #include "oct-env.h" | 57 #include "oct-env.h" |
283 connect (m_sync_octave_directory_action, &QAction::triggered, | 284 connect (m_sync_octave_directory_action, &QAction::triggered, |
284 this, &files_dock_widget::do_sync_octave_directory); | 285 this, &files_dock_widget::do_sync_octave_directory); |
285 connect (m_sync_browser_directory_action, &QAction::triggered, | 286 connect (m_sync_browser_directory_action, &QAction::triggered, |
286 this, &files_dock_widget::do_sync_browser_directory); | 287 this, &files_dock_widget::do_sync_browser_directory); |
287 | 288 |
288 gui_settings *settings = rmgr.get_settings (); | 289 gui_settings settings; |
289 // FIXME: what should happen if settings is 0? | |
290 | 290 |
291 // Create the QFileSystemModel starting in the desired directory | 291 // Create the QFileSystemModel starting in the desired directory |
292 QDir startup_dir; // take current dir | 292 QDir startup_dir; // take current dir |
293 | 293 |
294 if (settings->value (fb_restore_last_dir).toBool ()) | 294 if (settings.value (fb_restore_last_dir).toBool ()) |
295 { | 295 { |
296 // restore last dir from previous session | 296 // restore last dir from previous session |
297 QStringList last_dirs | 297 QStringList last_dirs |
298 = settings->value (fb_mru_list.key).toStringList (); | 298 = settings.value (fb_mru_list.key).toStringList (); |
299 if (last_dirs.length () > 0) | 299 if (last_dirs.length () > 0) |
300 startup_dir = QDir (last_dirs.at (0)); // last dir in previous session | 300 startup_dir = QDir (last_dirs.at (0)); // last dir in previous session |
301 } | 301 } |
302 else if (! settings->value (fb_startup_dir).toString ().isEmpty ()) | 302 else if (! settings.value (fb_startup_dir).toString ().isEmpty ()) |
303 { | 303 { |
304 // do not restore but there is a startup dir configured | 304 // do not restore but there is a startup dir configured |
305 startup_dir = QDir (settings->value (fb_startup_dir.key).toString ()); | 305 startup_dir = QDir (settings.value (fb_startup_dir.key).toString ()); |
306 } | 306 } |
307 | 307 |
308 if (! startup_dir.exists ()) | 308 if (! startup_dir.exists ()) |
309 { | 309 { |
310 // the configured startup dir does not exist, take actual one | 310 // the configured startup dir does not exist, take actual one |
347 addAction(m_rename_action); | 347 addAction(m_rename_action); |
348 | 348 |
349 // get sort column and order as well as column state (order and width) | 349 // get sort column and order as well as column state (order and width) |
350 | 350 |
351 m_file_tree_view->sortByColumn | 351 m_file_tree_view->sortByColumn |
352 (settings->value (fb_sort_column).toInt (), | 352 (settings.value (fb_sort_column).toInt (), |
353 static_cast<Qt::SortOrder> (settings->value (fb_sort_order).toUInt ())); | 353 static_cast<Qt::SortOrder> (settings.value (fb_sort_order).toUInt ())); |
354 // FIXME: use value<Qt::SortOrder> instead of static cast after | 354 // FIXME: use value<Qt::SortOrder> instead of static cast after |
355 // dropping support of Qt 5.4 | 355 // dropping support of Qt 5.4 |
356 | 356 |
357 if (settings->contains (fb_column_state.key)) | 357 if (settings.contains (fb_column_state.key)) |
358 m_file_tree_view->header ()->restoreState | 358 m_file_tree_view->header ()->restoreState |
359 (settings->value (fb_column_state.key).toByteArray ()); | 359 (settings.value (fb_column_state.key).toByteArray ()); |
360 | 360 |
361 // Set header properties for sorting | 361 // Set header properties for sorting |
362 m_file_tree_view->header ()->setSectionsClickable (true); | 362 m_file_tree_view->header ()->setSectionsClickable (true); |
363 m_file_tree_view->header ()->setSectionsMovable (true); | 363 m_file_tree_view->header ()->setSectionsMovable (true); |
364 m_file_tree_view->header ()->setSortIndicatorShown (true); | 364 m_file_tree_view->header ()->setSortIndicatorShown (true); |
365 | 365 |
366 QStringList mru_dirs = | 366 QStringList mru_dirs = |
367 settings->value (fb_mru_list.key).toStringList (); | 367 settings.value (fb_mru_list.key).toStringList (); |
368 m_current_directory->addItems (mru_dirs); | 368 m_current_directory->addItems (mru_dirs); |
369 | 369 |
370 m_current_directory->setEditText | 370 m_current_directory->setEditText |
371 (m_file_system_model->fileInfo (rootPathIndex). absoluteFilePath ()); | 371 (m_file_system_model->fileInfo (rootPathIndex). absoluteFilePath ()); |
372 | 372 |
428 make_window (); | 428 make_window (); |
429 } | 429 } |
430 | 430 |
431 void files_dock_widget::save_settings (void) | 431 void files_dock_widget::save_settings (void) |
432 { | 432 { |
433 resource_manager& rmgr = m_octave_qobj.get_resource_manager (); | 433 gui_settings settings; |
434 gui_settings *settings = rmgr.get_settings (); | |
435 | |
436 if (! settings) | |
437 return; | |
438 | 434 |
439 int sort_column = m_file_tree_view->header ()->sortIndicatorSection (); | 435 int sort_column = m_file_tree_view->header ()->sortIndicatorSection (); |
440 Qt::SortOrder sort_order = m_file_tree_view->header ()->sortIndicatorOrder (); | 436 Qt::SortOrder sort_order = m_file_tree_view->header ()->sortIndicatorOrder (); |
441 settings->setValue (fb_sort_column.key, sort_column); | 437 settings.setValue (fb_sort_column.key, sort_column); |
442 settings->setValue (fb_sort_order.key, sort_order); | 438 settings.setValue (fb_sort_order.key, sort_order); |
443 settings->setValue (fb_column_state.key, | 439 settings.setValue (fb_column_state.key, |
444 m_file_tree_view->header ()->saveState ()); | 440 m_file_tree_view->header ()->saveState ()); |
445 | 441 |
446 QStringList dirs; | 442 QStringList dirs; |
447 for (int i=0; i< m_current_directory->count (); i++) | 443 for (int i=0; i< m_current_directory->count (); i++) |
448 { | 444 { |
449 dirs.append (m_current_directory->itemText (i)); | 445 dirs.append (m_current_directory->itemText (i)); |
450 } | 446 } |
451 settings->setValue (fb_mru_list.key, dirs); | 447 settings.setValue (fb_mru_list.key, dirs); |
452 | 448 |
453 settings->sync (); | 449 settings.sync (); |
454 | 450 |
455 octave_dock_widget::save_settings (); | 451 octave_dock_widget::save_settings (); |
456 | 452 |
457 if (m_sig_mapper) | 453 if (m_sig_mapper) |
458 delete m_sig_mapper; | 454 delete m_sig_mapper; |
532 else | 528 else |
533 { | 529 { |
534 QString abs_fname = fileInfo.absoluteFilePath (); | 530 QString abs_fname = fileInfo.absoluteFilePath (); |
535 | 531 |
536 QString suffix = fileInfo.suffix ().toLower (); | 532 QString suffix = fileInfo.suffix ().toLower (); |
537 resource_manager& rmgr = m_octave_qobj.get_resource_manager (); | 533 |
538 gui_settings *settings = rmgr.get_settings (); | 534 gui_settings settings; |
539 QString ext = settings->value (fb_txt_file_ext).toString (); | 535 |
536 QString ext = settings.value (fb_txt_file_ext).toString (); | |
540 #if defined (HAVE_QT_SPLITBEHAVIOR_ENUM) | 537 #if defined (HAVE_QT_SPLITBEHAVIOR_ENUM) |
541 QStringList extensions = ext.split (";", Qt::SkipEmptyParts); | 538 QStringList extensions = ext.split (";", Qt::SkipEmptyParts); |
542 #else | 539 #else |
543 QStringList extensions = ext.split (";", QString::SkipEmptyParts); | 540 QStringList extensions = ext.split (";", QString::SkipEmptyParts); |
544 #endif | 541 #endif |
563 QDesktopServices::openUrl (QUrl::fromLocalFile (file)); | 560 QDesktopServices::openUrl (QUrl::fromLocalFile (file)); |
564 } | 561 } |
565 | 562 |
566 void files_dock_widget::toggle_header (int col) | 563 void files_dock_widget::toggle_header (int col) |
567 { | 564 { |
568 resource_manager& rmgr = m_octave_qobj.get_resource_manager (); | 565 gui_settings settings; |
569 gui_settings *settings = rmgr.get_settings (); | |
570 | 566 |
571 QString key = m_columns_shown_keys.at (col); | 567 QString key = m_columns_shown_keys.at (col); |
572 bool shown = settings->value (key, false).toBool (); | 568 bool shown = settings.value (key, false).toBool (); |
573 settings->setValue (key, ! shown); | 569 settings.setValue (key, ! shown); |
574 settings->sync (); | 570 settings.sync (); |
575 | 571 |
576 switch (col) | 572 switch (col) |
577 { | 573 { |
578 case 0: | 574 case 0: |
579 case 1: | 575 case 1: |
582 m_file_tree_view->setColumnHidden (col + 1, shown); | 578 m_file_tree_view->setColumnHidden (col + 1, shown); |
583 break; | 579 break; |
584 case 3: | 580 case 3: |
585 case 4: | 581 case 4: |
586 // other actions depending on new settings | 582 // other actions depending on new settings |
587 notice_settings (settings); | 583 notice_settings (); |
588 break; | 584 break; |
589 } | 585 } |
590 } | 586 } |
591 | 587 |
592 void files_dock_widget::headercontextmenu_requested (const QPoint& mpos) | 588 void files_dock_widget::headercontextmenu_requested (const QPoint& mpos) |
595 | 591 |
596 if (m_sig_mapper) | 592 if (m_sig_mapper) |
597 delete m_sig_mapper; | 593 delete m_sig_mapper; |
598 m_sig_mapper = new QSignalMapper (this); | 594 m_sig_mapper = new QSignalMapper (this); |
599 | 595 |
600 resource_manager& rmgr = m_octave_qobj.get_resource_manager (); | 596 gui_settings settings; |
601 gui_settings *settings = rmgr.get_settings (); | |
602 | 597 |
603 for (int i = 0; i < m_columns_shown.size (); i++) | 598 for (int i = 0; i < m_columns_shown.size (); i++) |
604 { | 599 { |
605 QAction *action = menu.addAction (m_columns_shown.at (i), | 600 QAction *action = menu.addAction (m_columns_shown.at (i), |
606 m_sig_mapper, SLOT (map ())); | 601 m_sig_mapper, SLOT (map ())); |
607 m_sig_mapper->setMapping (action, i); | 602 m_sig_mapper->setMapping (action, i); |
608 action->setCheckable (true); | 603 action->setCheckable (true); |
609 action->setChecked | 604 action->setChecked |
610 (settings->value (m_columns_shown_keys.at (i), | 605 (settings.value (m_columns_shown_keys.at (i), |
611 m_columns_shown_defs.at (i)).toBool ()); | 606 m_columns_shown_defs.at (i)).toBool ()); |
612 } | 607 } |
613 | 608 |
614 // FIXME: We could use | 609 // FIXME: We could use |
615 // | 610 // |
616 // connect (&m_sig_mapper, QOverload<int>::of (&QSignalMapper::mapped), | 611 // connect (&m_sig_mapper, QOverload<int>::of (&QSignalMapper::mapped), |
1005 process_find_files (info.absoluteFilePath ()); | 1000 process_find_files (info.absoluteFilePath ()); |
1006 } | 1001 } |
1007 } | 1002 } |
1008 } | 1003 } |
1009 | 1004 |
1010 void files_dock_widget::notice_settings (const gui_settings *settings) | 1005 void files_dock_widget::notice_settings (void) |
1011 { | 1006 { |
1007 gui_settings settings; | |
1008 | |
1012 // QSettings pointer is checked before emitting. | 1009 // QSettings pointer is checked before emitting. |
1013 | 1010 |
1014 int size_idx = settings->value (global_icon_size).toInt (); | 1011 int size_idx = settings.value (global_icon_size).toInt (); |
1015 size_idx = (size_idx > 0) - (size_idx < 0) + 1; // Make valid index from 0 to 2 | 1012 size_idx = (size_idx > 0) - (size_idx < 0) + 1; // Make valid index from 0 to 2 |
1016 | 1013 |
1017 QStyle *st = style (); | 1014 QStyle *st = style (); |
1018 int icon_size = st->pixelMetric (global_icon_sizes[size_idx]); | 1015 int icon_size = st->pixelMetric (global_icon_sizes[size_idx]); |
1019 m_navigation_tool_bar->setIconSize (QSize (icon_size, icon_size)); | 1016 m_navigation_tool_bar->setIconSize (QSize (icon_size, icon_size)); |
1020 | 1017 |
1021 // filenames are always shown, other columns can be hidden by settings | 1018 // filenames are always shown, other columns can be hidden by settings |
1022 for (int i = 0; i < 3; i++) | 1019 for (int i = 0; i < 3; i++) |
1023 m_file_tree_view->setColumnHidden (i + 1, | 1020 m_file_tree_view->setColumnHidden (i + 1, |
1024 ! settings->value (m_columns_shown_keys.at (i),false).toBool ()); | 1021 ! settings.value (m_columns_shown_keys.at (i),false).toBool ()); |
1025 | 1022 |
1026 QDir::Filters current_filter = m_file_system_model->filter (); | 1023 QDir::Filters current_filter = m_file_system_model->filter (); |
1027 if (settings->value (m_columns_shown_keys.at (3), false).toBool ()) | 1024 if (settings.value (m_columns_shown_keys.at (3), false).toBool ()) |
1028 m_file_system_model->setFilter (current_filter | QDir::Hidden); | 1025 m_file_system_model->setFilter (current_filter | QDir::Hidden); |
1029 else | 1026 else |
1030 m_file_system_model->setFilter (current_filter & (~QDir::Hidden)); | 1027 m_file_system_model->setFilter (current_filter & (~QDir::Hidden)); |
1031 | 1028 |
1032 m_file_tree_view->setAlternatingRowColors | 1029 m_file_tree_view->setAlternatingRowColors |
1033 (settings->value (m_columns_shown_keys.at (4),true).toBool ()); | 1030 (settings.value (m_columns_shown_keys.at (4),true).toBool ()); |
1034 m_file_tree_view->setModel (m_file_system_model); | 1031 m_file_tree_view->setModel (m_file_system_model); |
1035 | 1032 |
1036 // enable the buttons to sync octave/browser dir | 1033 // enable the buttons to sync octave/browser dir |
1037 // only if this is not done by default | 1034 // only if this is not done by default |
1038 m_sync_octave_dir | 1035 m_sync_octave_dir |
1039 = settings->value (fb_sync_octdir).toBool (); | 1036 = settings.value (fb_sync_octdir).toBool (); |
1040 m_sync_octave_directory_action->setEnabled (! m_sync_octave_dir); | 1037 m_sync_octave_directory_action->setEnabled (! m_sync_octave_dir); |
1041 m_sync_browser_directory_action->setEnabled (! m_sync_octave_dir); | 1038 m_sync_browser_directory_action->setEnabled (! m_sync_octave_dir); |
1042 | 1039 |
1043 // If m_sync_octave_dir is enabled, then we want the file browser to | 1040 // If m_sync_octave_dir is enabled, then we want the file browser to |
1044 // update to match the current working directory of the | 1041 // update to match the current working directory of the |
1062 | 1059 |
1063 void files_dock_widget::popdownmenu_search_dir (bool) | 1060 void files_dock_widget::popdownmenu_search_dir (bool) |
1064 { | 1061 { |
1065 // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved. | 1062 // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved. |
1066 int opts = QFileDialog::ShowDirsOnly; | 1063 int opts = QFileDialog::ShowDirsOnly; |
1067 resource_manager& rmgr = m_octave_qobj.get_resource_manager (); | 1064 |
1068 gui_settings *settings = rmgr.get_settings (); | 1065 gui_settings settings; |
1069 if (! settings->value (global_use_native_dialogs).toBool ()) | 1066 |
1067 if (! settings.value (global_use_native_dialogs).toBool ()) | |
1070 opts |= QFileDialog::DontUseNativeDialog; | 1068 opts |= QFileDialog::DontUseNativeDialog; |
1071 | 1069 |
1072 QString dir = QFileDialog::getExistingDirectory (this, | 1070 QString dir = QFileDialog::getExistingDirectory (this, |
1073 tr ("Set directory of file browser"), | 1071 tr ("Set directory of file browser"), |
1074 m_file_system_model->rootPath (), | 1072 m_file_system_model->rootPath (), |