26#if defined (HAVE_CONFIG_H)
36#include <QFontComboBox>
37#include <QFontDatabase>
38#include <QLibraryInfo>
40#include <QNetworkProxy>
41#if defined (HAVE_QSTANDARDPATHS)
42# include <QStandardPaths>
44# include <QDesktopServices>
69 : m_settings_directory (), m_settings_file (), m_settings (nullptr),
70 m_default_settings (nullptr), m_temporary_files ()
74 =
new gui_settings (QSettings::IniFormat, QSettings::UserScope,
75 "octave",
"octave-gui");
82 QString xdg_config_home
83 = QString::fromLocal8Bit (qgetenv (
"XDG_CONFIG_HOME"));
85 if ((! sfile.exists ()) && xdg_config_home.isEmpty ())
93#if defined (HAVE_QSTANDARDPATHS)
95 = QStandardPaths::writableLocation (QStandardPaths::HomeLocation);
98 = QDesktopServices::storageLocation (QDesktopServices::HomeLocation);
101 QString old_settings_directory = home_path +
"/.config/octave";
102 QString old_settings_file = old_settings_directory +
"/qt-settings";
104 QFile ofile (old_settings_file);
110 gui_settings old_settings (old_settings_file, QSettings::IniFormat);
112 QStringList keys = old_settings.allKeys ();
113 for (
int i = 0; i < keys.count(); i++)
115 old_settings.
value(keys.at(i)));
141 QTranslator *qsci_tr,
147 = QLibraryInfo::location (QLibraryInfo::TranslationsPath);
149 QString language =
"SYSTEM";
162 if (language ==
"SYSTEM")
168 qt_tr->load (sys_locale,
"qt",
"_", qt_trans_dir);
169 qsci_tr->load (sys_locale,
"qscintilla",
"_", qt_trans_dir);
175 loaded = qt_tr->load (
"qt_" + language, qt_trans_dir);
177 qt_tr->load (
"qt_" + language.toLower (), qt_trans_dir);
179 loaded = qsci_tr->load (
"qscintilla_" + language, qt_trans_dir);
181 qsci_tr->load (
"qscintilla_" + language.toLower (), qt_trans_dir);
210 QString default_family;
213 QFontComboBox font_combo_box;
214 font_combo_box.setFontFilters (QFontComboBox::MonospacedFonts);
217 for (
int index = 0; index < font_combo_box.count(); index++)
218 fonts << font_combo_box.itemText(index);
220#if defined (Q_OS_MAC)
230 if (default_family.isEmpty ())
233 QFont fixed_font = QFontDatabase::systemFont (QFontDatabase::FixedFont);
234 default_family = fixed_font.defaultFamily ();
237 if (! fonts.contains (default_family))
241 default_family = fonts[0];
247 if (! env_default_family.empty ())
250 return default_family;
260 QFont font = QApplication::font ();
262 int font_size = font.pointSize ();
264 font_size =
static_cast <int> (
std::floor(font.pointSizeF ()));
267 QString default_font_size =
"10";
269 default_font_size = QString::number (font_size);
271 std::string env_default_font_size
274 if (! env_default_font_size.empty ())
278 result << default_family;
279 result << default_font_size;
287 QString custom_editor;
288 QStringList def_font;
297 std::string env_default_editor
300 if (! env_default_editor.empty ())
310 if (! custom_editor.isEmpty ())
314 if (def_font.count () > 1)
326#if defined (HAVE_QSCINTILLA)
330 int actual_style = 0;
333 if ((
lexer->description (actual_style)) !=
"")
334 styles[max_style++] = actual_style;
342 const QFont& base)
const
346 dest.setBold (attr.bold ());
347 dest.setItalic (attr.italic ());
348 dest.setUnderline (attr.underline ());
353#if defined (HAVE_QSCINTILLA)
372 QStringList lexer_keys =
settings->allKeys ();
386 QFont df (def_font[0], def_font[1].toInt ());
388 lexer->setDefaultFont (dfa);
395 for (
int i = 0; i < max_style; i++)
397 c =
settings->get_color_value (QVariant (
lexer->color (styles[i])), m);
398 lexer->setColor (c, styles[i]);
399 p =
settings->get_color_value (QVariant (
lexer->paper (styles[i])), m);
400 lexer->setPaper (p, styles[i]);
402 lexer->setFont (dfa, styles[i]);
405 lexer->setDefaultColor (
lexer->color (styles[0]));
406 lexer->setDefaultPaper (
lexer->paper (styles[0]));
411 const std::string group_str = group.toStdString ();
419 const std::string group_str = group.toStdString ();
430 if (
m_settings->status () == QSettings::NoError)
437 if (! (QFile::exists (
m_settings->fileName ())
439 &&
m_settings->status () == QSettings::NoError))
442 = QString (QT_TR_NOOP (
"The settings file\n%1\n"
443 "does not exist and can not be created.\n"
444 "Make sure you have read and write permissions to\n%2\n\n"
445 "Octave GUI must be closed now."));
447 QMessageBox::critical (
nullptr,
448 QString (QT_TR_NOOP (
"Octave Critical Error")),
458 const QString& new_key)
484 QNetworkProxy::ProxyType proxy_type = QNetworkProxy::NoProxy;
490 QUrl proxy_url = QUrl ();
495 QString proxy_type_string
499 if (proxy_type_string ==
"Socks5Proxy")
500 proxy_type = QNetworkProxy::Socks5Proxy;
501 else if (proxy_type_string ==
"HttpProxy")
502 proxy_type = QNetworkProxy::HttpProxy;
505 if (proxy_type_string ==
"HttpProxy"
506 || proxy_type_string ==
"Socks5Proxy")
516 if (proxy_type_string ==
"HttpProxy")
518 else if (proxy_type_string ==
"Socks5Proxy")
521 QUrl env_var_url = QUrl ();
522 proxy_url.setScheme (scheme);
523 proxy_url.setHost (host);
524 proxy_url.setPort (port);
525 if (! user.isEmpty ())
526 proxy_url.setUserName (user);
527 if (! pass.isEmpty ())
528 proxy_url.setPassword (pass);
534 const std::array<std::string, 6> env_vars =
536 "ALL_PROXY",
"all_proxy",
537 "HTTP_PROXY",
"http_proxy",
538 "HTTPS_PROXY",
"https_proxy"
541 unsigned int count = 0;
542 while (! proxy_url.isValid () && count < env_vars.size ())
549 if (proxy_url.isValid ())
552 scheme = proxy_url.scheme ();
554 if (scheme.contains (
"socks", Qt::CaseInsensitive))
555 proxy_type = QNetworkProxy::Socks5Proxy;
557 proxy_type = QNetworkProxy::HttpProxy;
559 host = proxy_url.host ();
560 port = proxy_url.port ();
561 user = proxy_url.userName ();
562 pass = proxy_url.password ();
568 proxy.setType (proxy_type);
569 proxy.setHostName (host);
570 proxy.setPort (port);
571 proxy.setUser (user);
572 proxy.setPassword (pass);
574 QNetworkProxy::setApplicationProxy (proxy);
577 std::string proxy_url_str = proxy_url.toString().toStdString ();
588 return QIcon (
":/actions/icons/" + icon_name +
".png");
593 return QIcon::fromTheme (icon_name,
594 QIcon (
":/actions/icons/" + icon_name +
".png"));
596 return QIcon::fromTheme (icon_name);
603 QList<int> all_mibs = QTextCodec::availableMibs ();
604 for (
auto mib : all_mibs)
606 QTextCodec *c = QTextCodec::codecForMib (mib);
607 codecs->append (c->name ().toUpper ());
611 codecs->append (QString (
"SYSTEM (") +
616 codecs->removeDuplicates ();
617 std::sort (codecs->begin (), codecs->end ());
622 const QString& current)
624 QStringList all_codecs;
628 QString enc = current;
634 bool default_exists =
false;
635 bool show_system =
false;
639 default_exists =
true;
641 QString default_enc =
642 QString (
"SYSTEM (") +
659 for (
const auto& c : all_codecs)
663 combo->insertSeparator (0);
664 if (show_system || ! default_exists)
665 combo->insertItem (0, default_enc);
670 int idx = combo->findText (enc, Qt::MatchExactly);
672 combo->setCurrentIndex (idx);
674 combo->setCurrentIndex (0);
676 combo->setMaxVisibleItems (12);
679 QPointer<QTemporaryFile>
681 const QString& contents)
683 QString ext = extension;
684 if ((! ext.isEmpty ()) && (! ext.startsWith (
'.')))
685 ext = QString (
".") + ext;
688 QString tmp_dir = QDir::tempPath () + QDir::separator() +
"octave";
689 QDir::temp ().mkdir (
"octave");
692 QPointer<QTemporaryFile> tmp_file
693 =
new QTemporaryFile (tmp_dir + QDir::separator() +
694 "octave_XXXXXX" + ext,
this);
696 if (tmp_file->open ())
698 tmp_file->write (contents.toUtf8 ());
711 if (tmp_file->exists ())
QVariant value(const gui_pref &pref) const
QString get_default_font_family(void)
void combo_encoding(QComboBox *combo, const QString ¤t=QString())
gui_settings * get_settings(void) const
QStringList get_default_font(void)
gui_settings * get_default_settings(void) const
QString get_settings_file(void)
void read_lexer_settings(QsciLexer *lexer, gui_settings *settings, int mode=0, int def=0)
gui_settings * m_settings
void get_codecs(QStringList *codecs)
QFont copy_font_attributes(const QFont &attr, const QFont &base) const
QString m_settings_directory
gui_settings * m_default_settings
int get_valid_lexer_styles(QsciLexer *lexer, int *styles)
QString get_gui_translation_dir(void)
bool is_first_run(void) const
QList< QTemporaryFile * > m_temporary_files
QPointer< QTemporaryFile > create_tmp_file(const QString &extension=QString(), const QString &contents=QString())
void update_network_settings(void)
QIcon icon(const QString &icon_name, bool fallback=true)
void remove_tmp_file(QPointer< QTemporaryFile > tmp_file)
bool update_settings_key(const QString &new_key, const QString &old_key)
QString get_settings_directory(void)
void set_settings(const QString &file)
void config_translators(QTranslator *qt_tr, QTranslator *qsci_tr, QTranslator *gui_tr)
void reload_settings(void)
static std::string getenv(const std::string &name)
static void putenv(const std::string &name, const std::string &value)
const gui_pref cs_font_size("terminal/fontSize", QVariant(10))
const gui_pref cs_font("terminal/fontName", QVariant())
const int ed_max_lexer_styles
const gui_pref ed_default_enc("editor/default_encoding", QVariant("UTF-8"))
const int ed_max_style_number
const gui_pref global_use_proxy("useProxyServer", QVariant(false))
const gui_pref global_mono_font("monospace_font", global_font_family)
const gui_pref global_proxy_pass("proxyPassword", QVariant(QString()))
const QStringList global_proxy_all_types(QStringList()<< "HttpProxy"<< "Socks5Proxy"<< QT_TRANSLATE_NOOP("octave::settings_dialog", "Environment Variables"))
const gui_pref global_proxy_host("proxyHostName", QVariant(QString()))
const gui_pref global_proxy_type("proxyType", QVariant(QString()))
const gui_pref global_proxy_user("proxyUserName", QVariant(QString()))
const gui_pref global_icon_theme("use_system_icon_theme", QVariant(true))
const gui_pref global_custom_editor("customFileEditor", QVariant("emacs +%l %f"))
const gui_pref global_proxy_port("proxyPort", QVariant(80))
const gui_pref global_language("language", QVariant("SYSTEM"))
const QStringList settings_color_modes_ext(QStringList()<< ""<< "_2")
const int settings_reload_default_colors_flag
const char * octave_locale_charset_wrapper(void)
std::string oct_locale_dir(void)
QString fromStdString(const std::string &s)
std::complex< T > floor(const std::complex< T > &x)
int system(const std::string &cmd_str)