From ed0a2488a7aa93f1c20c942d8d952ca6b1752e6a Mon Sep 17 00:00:00 2001 From: RadRussianRus Date: Tue, 30 Aug 2022 14:49:26 +0300 Subject: [PATCH] [Option][GUI] File dialog chooser --- Telegram/Resources/langs/rewrites/en.json | 4 ++ .../SourceFiles/kotato/kotato_settings.cpp | 21 +++++++++ .../kotato/kotato_settings_menu.cpp | 44 +++++++++++++++++++ .../platform/linux/file_utilities_linux.cpp | 19 ++++++++ .../platform/linux/file_utilities_linux.h | 7 +++ .../platform/linux/linux_xdp_file_dialog.cpp | 5 ++- .../platform/mac/file_utilities_mac.h | 13 ++++++ .../platform/platform_file_utilities.h | 5 +++ .../platform/win/file_utilities_win.h | 17 +++++++ 9 files changed, 134 insertions(+), 1 deletion(-) diff --git a/Telegram/Resources/langs/rewrites/en.json b/Telegram/Resources/langs/rewrites/en.json index 6028ca9da..5fd5d9f68 100644 --- a/Telegram/Resources/langs/rewrites/en.json +++ b/Telegram/Resources/langs/rewrites/en.json @@ -56,6 +56,10 @@ "ktg_net_speed_boost_big": "Big", "ktg_settings_system": "System", "ktg_settings_qt_scale": "Qt scaling engine", + "ktg_settings_file_dialog_type": "File chooser dialog", + "ktg_file_dialog_type_default": "Default", + "ktg_file_dialog_disabled_on_build": "Disabled on build time", + "ktg_file_dialog_disabled_by_option": "Disabled by option", "ktg_settings_other": "Other", "ktg_profile_copy_id": "Copy ID", "ktg_profile_bot_id": "Bot ID", diff --git a/Telegram/SourceFiles/kotato/kotato_settings.cpp b/Telegram/SourceFiles/kotato/kotato_settings.cpp index ca7597585..d67503424 100644 --- a/Telegram/SourceFiles/kotato/kotato_settings.cpp +++ b/Telegram/SourceFiles/kotato/kotato_settings.cpp @@ -198,6 +198,23 @@ CheckHandler ReplacesLimit() { }; } +CheckHandler FileDialogLimit() { + return [=] (QVariant value) -> QVariant { + using Platform::FileDialog::ImplementationType; + auto newValue = int(ImplementationType::Default); + if (value.canConvert()) { + auto intValue = value.toInt(); + if (intValue >= int(ImplementationType::Default) + && intValue < int(ImplementationType::Count)) { + + newValue = intValue; + } else if (intValue >= int(ImplementationType::Count)) { + newValue = int(ImplementationType::Count) - 1; + } + } + return newValue; + }; +} CheckHandler NetSpeedBoostConv(CheckHandler wrapped = nullptr) { return [=] (QVariant value) -> QVariant { @@ -376,6 +393,10 @@ const std::map> DefinitionMap { .type = SettingType::BoolSetting, .defaultValue = false, }}, #endif + { "file_dialog_type", { + .type = SettingType::IntSetting, + .defaultValue = int(Platform::FileDialog::ImplementationType::Default), + .limitHandler = FileDialogLimit(), }}, }; using OldOptionKey = QString; diff --git a/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp b/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp index 6abaabf28..c627f8786 100644 --- a/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp +++ b/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp @@ -45,6 +45,20 @@ namespace Settings { namespace { +QString FileDialogTypeLabel(int value) { + const auto typedValue = Platform::FileDialog::ImplementationType(value); + switch (typedValue) { + case Platform::FileDialog::ImplementationType::Default: + return ktr("ktg_file_dialog_type_default"); + } + return Platform::FileDialog::ImplementationTypeLabel(typedValue); +} + +QString FileDialogTypeDescription(int value) { + const auto typedValue = Platform::FileDialog::ImplementationType(value); + return Platform::FileDialog::ImplementationTypeDescription(typedValue); +} + QString NetBoostLabel(int boost) { switch (boost) { @@ -417,6 +431,36 @@ void SetupKotatoSystem( }, container->lifetime()); #endif // Qt < 6.0.0 + if (Platform::IsLinux()) { + auto fileDialogTypeText = rpl::single( + FileDialogTypeLabel(::Kotato::JsonSettings::GetInt("file_dialog_type")) + ) | rpl::then( + ::Kotato::JsonSettings::Events( + "file_dialog_type" + ) | rpl::map([] { + return FileDialogTypeLabel(::Kotato::JsonSettings::GetInt("file_dialog_type")); + }) + ); + + AddButtonWithLabel( + container, + rktr("ktg_settings_file_dialog_type"), + fileDialogTypeText, + st::settingsButton + )->addClickHandler([=] { + Ui::show(Box<::Kotato::RadioBox>( + ktr("ktg_settings_file_dialog_type"), + ::Kotato::JsonSettings::GetInt("file_dialog_type"), + int(Platform::FileDialog::ImplementationType::Count), + FileDialogTypeLabel, + FileDialogTypeDescription, + [=](int value) { + ::Kotato::JsonSettings::Set("file_dialog_type", value); + ::Kotato::JsonSettings::Write(); + }, false)); + }); + } + AddSkip(container); } diff --git a/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp b/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp index 0437363c3..453ccfd40 100644 --- a/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp @@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "platform/linux/file_utilities_linux.h" +#include "kotato/kotato_lang.h" + #ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION #include "platform/linux/linux_xdp_file_dialog.h" #include "platform/linux/linux_xdp_open_with_dialog.h" @@ -83,6 +85,23 @@ void UnsafeLaunch(const QString &filepath) { namespace FileDialog { +QString ImplementationTypeLabel(ImplementationType value) { + switch (value) { + case ImplementationType::XDP: return qsl("XDG Desktop Portal"); + case ImplementationType::Qt: return qsl("Qt"); + } + Unexpected("Value in Platform::FileDialog::ImplementationTypeLabel."); +} + +QString ImplementationTypeDescription(ImplementationType value) { + switch (value) { +#ifdef DESKTOP_APP_DISABLE_DBUS_INTEGRATION + case ImplementationType::XDP: return ktr("ktg_file_dialog_disabled_on_build"); +#endif // DESKTOP_APP_DISABLE_DBUS_INTEGRATION + } + return QString(); +} + bool Get( QPointer parent, QStringList &files, diff --git a/Telegram/SourceFiles/platform/linux/file_utilities_linux.h b/Telegram/SourceFiles/platform/linux/file_utilities_linux.h index 00008a8ca..bf5cb3816 100644 --- a/Telegram/SourceFiles/platform/linux/file_utilities_linux.h +++ b/Telegram/SourceFiles/platform/linux/file_utilities_linux.h @@ -27,6 +27,13 @@ inline void PostprocessDownloaded(const QString &filepath) { namespace FileDialog { +enum class ImplementationType { + Default, + XDP, + Qt, + Count, +}; + inline void InitLastPath() { ::FileDialog::internal::InitLastPathDefault(); } diff --git a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp index 392a77503..a9028ffd2 100644 --- a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "platform/linux/linux_xdp_file_dialog.h" +#include "kotato/kotato_settings.h" #include "platform/platform_file_utilities.h" #include "base/platform/base_platform_info.h" #include "base/platform/linux/base_linux_glibmm_helper.h" @@ -684,7 +685,9 @@ std::optional Get( const QString &filter, Type type, QString startFile) { - if (!FileChooserPortalVersion.has_value() + const auto fileDialogType = ImplementationType(::Kotato::JsonSettings::GetInt("file_dialog_type")); + if (fileDialogType > ImplementationType::XDP + || !FileChooserPortalVersion.has_value() || (type == Type::ReadFolder && *FileChooserPortalVersion < 3)) { return std::nullopt; } diff --git a/Telegram/SourceFiles/platform/mac/file_utilities_mac.h b/Telegram/SourceFiles/platform/mac/file_utilities_mac.h index aacb80c4c..13387335e 100644 --- a/Telegram/SourceFiles/platform/mac/file_utilities_mac.h +++ b/Telegram/SourceFiles/platform/mac/file_utilities_mac.h @@ -27,6 +27,19 @@ inline void PostprocessDownloaded(const QString &filepath) { namespace FileDialog { +enum class ImplementationType { + Default, + Count, +}; + +inline QString ImplementationTypeLabel(ImplementationType value) { + Unexpected("Value in Platform::FileDialog::ImplementationTypeLabel."); +} + +inline QString ImplementationTypeDescription(ImplementationType value) { + return QString(); +} + inline void InitLastPath() { ::FileDialog::internal::InitLastPathDefault(); } diff --git a/Telegram/SourceFiles/platform/platform_file_utilities.h b/Telegram/SourceFiles/platform/platform_file_utilities.h index ad229d244..6a9ab46e6 100644 --- a/Telegram/SourceFiles/platform/platform_file_utilities.h +++ b/Telegram/SourceFiles/platform/platform_file_utilities.h @@ -27,6 +27,11 @@ void PostprocessDownloaded(const QString &filepath); namespace FileDialog { +enum class ImplementationType; + +QString ImplementationTypeLabel(ImplementationType value); +QString ImplementationTypeDescription(ImplementationType value); + void InitLastPath(); bool Get( diff --git a/Telegram/SourceFiles/platform/win/file_utilities_win.h b/Telegram/SourceFiles/platform/win/file_utilities_win.h index 4a5b07f66..d0e9990f1 100644 --- a/Telegram/SourceFiles/platform/win/file_utilities_win.h +++ b/Telegram/SourceFiles/platform/win/file_utilities_win.h @@ -21,4 +21,21 @@ inline void UnsafeOpenUrl(const QString &url) { } } // namespace File + +namespace FileDialog { + +enum class ImplementationType { + Default, + Count, +}; + +inline QString ImplementationTypeLabel(ImplementationType value) { + Unexpected("Value in Platform::FileDialog::ImplementationTypeLabel."); +} + +inline QString ImplementationTypeDescription(ImplementationType value) { + return QString(); +} + +} // namespace FileDialog } // namespace Platform