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 (),