Add option to choose file dialog
This commit is contained in:
		
							parent
							
								
									a618181120
								
							
						
					
					
						commit
						ecb10dca8a
					
				
					 14 changed files with 101 additions and 6 deletions
				
			
		|  | @ -2754,6 +2754,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | ||||||
| "ktg_settings_system" = "System"; | "ktg_settings_system" = "System"; | ||||||
| "ktg_settings_gtk_integration" = "GTK integration"; | "ktg_settings_gtk_integration" = "GTK integration"; | ||||||
| 
 | 
 | ||||||
|  | "ktg_settings_file_dialog_type" = "File dialog"; | ||||||
|  | "ktg_file_dialog_type_default" = "Default"; | ||||||
|  | 
 | ||||||
| "ktg_settings_other" = "Other"; | "ktg_settings_other" = "Other"; | ||||||
| "ktg_profile_copy_id" = "Copy ID"; | "ktg_profile_copy_id" = "Copy ID"; | ||||||
| "ktg_profile_bot_id" = "Bot ID"; | "ktg_profile_bot_id" = "Bot ID"; | ||||||
|  |  | ||||||
|  | @ -68,6 +68,8 @@ | ||||||
| 	"ktg_net_speed_boost_big": "Big", | 	"ktg_net_speed_boost_big": "Big", | ||||||
| 	"ktg_settings_system": "System", | 	"ktg_settings_system": "System", | ||||||
| 	"ktg_settings_gtk_integration": "GTK integration", | 	"ktg_settings_gtk_integration": "GTK integration", | ||||||
|  | 	"ktg_settings_file_dialog_type": "File dialog", | ||||||
|  | 	"ktg_file_dialog_type_default": "Default", | ||||||
| 	"ktg_settings_other": "Other", | 	"ktg_settings_other": "Other", | ||||||
| 	"ktg_profile_copy_id": "Copy ID", | 	"ktg_profile_copy_id": "Copy ID", | ||||||
| 	"ktg_profile_bot_id": "Bot ID", | 	"ktg_profile_bot_id": "Bot ID", | ||||||
|  |  | ||||||
|  | @ -67,6 +67,8 @@ | ||||||
| 	"ktg_net_speed_boost_big": "Высокое", | 	"ktg_net_speed_boost_big": "Высокое", | ||||||
| 	"ktg_settings_system": "Система", | 	"ktg_settings_system": "Система", | ||||||
| 	"ktg_settings_gtk_integration": "GTK-интеграция", | 	"ktg_settings_gtk_integration": "GTK-интеграция", | ||||||
|  | 	"ktg_settings_file_dialog_type": "Файловый диалог", | ||||||
|  | 	"ktg_file_dialog_type_default": "По умолчанию", | ||||||
| 	"ktg_settings_other": "Прочие", | 	"ktg_settings_other": "Прочие", | ||||||
| 	"ktg_profile_copy_id": "Копировать ID", | 	"ktg_profile_copy_id": "Копировать ID", | ||||||
| 	"ktg_profile_bot_id": "ID бота", | 	"ktg_profile_bot_id": "ID бота", | ||||||
|  |  | ||||||
|  | @ -370,6 +370,7 @@ QByteArray GenerateSettingsJson(bool areDefault = false) { | ||||||
| 	settings.insert(qsl("userpic_corner_type"), cUserpicCornersType()); | 	settings.insert(qsl("userpic_corner_type"), cUserpicCornersType()); | ||||||
| 	settings.insert(qsl("always_show_top_userpic"), cShowTopBarUserpic()); | 	settings.insert(qsl("always_show_top_userpic"), cShowTopBarUserpic()); | ||||||
| 	settings.insert(qsl("gtk_integration"), cGtkIntegration()); | 	settings.insert(qsl("gtk_integration"), cGtkIntegration()); | ||||||
|  | 	settings.insert(qsl("file_dialog_type"), int(cFileDialogType())); | ||||||
| 	settings.insert(qsl("disable_tray_counter"), cDisableTrayCounter()); | 	settings.insert(qsl("disable_tray_counter"), cDisableTrayCounter()); | ||||||
| 	settings.insert(qsl("use_telegram_panel_icon"), cUseTelegramPanelIcon()); | 	settings.insert(qsl("use_telegram_panel_icon"), cUseTelegramPanelIcon()); | ||||||
| 	settings.insert(qsl("custom_app_icon"), cCustomAppIcon()); | 	settings.insert(qsl("custom_app_icon"), cCustomAppIcon()); | ||||||
|  | @ -616,6 +617,14 @@ bool Manager::readCustomFile() { | ||||||
| 		cSetGtkIntegration(v); | 		cSetGtkIntegration(v); | ||||||
| 	}); | 	}); | ||||||
| 
 | 
 | ||||||
|  | 	ReadIntOption(settings, "file_dialog_type", [&](auto v) { | ||||||
|  | 		const auto typedValue = Platform::FileDialog::ImplementationType(v); | ||||||
|  | 		if (typedValue >= Platform::FileDialog::ImplementationType::Default | ||||||
|  | 			&& typedValue < Platform::FileDialog::ImplementationType::Count) { | ||||||
|  | 			cSetFileDialogType(typedValue); | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
| 	ReadBoolOption(settings, "disable_tray_counter", [&](auto v) { | 	ReadBoolOption(settings, "disable_tray_counter", [&](auto v) { | ||||||
| 		cSetDisableTrayCounter(v); | 		cSetDisableTrayCounter(v); | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
|  | @ -148,6 +148,7 @@ rpl::producer<int> RecentStickersLimitChanges() { | ||||||
| int gUserpicCornersType = 3; | int gUserpicCornersType = 3; | ||||||
| bool gShowTopBarUserpic = false; | bool gShowTopBarUserpic = false; | ||||||
| bool gGtkIntegration = false; | bool gGtkIntegration = false; | ||||||
|  | Platform::FileDialog::ImplementationType gFileDialogType = Platform::FileDialog::ImplementationType::Default; | ||||||
| bool gDisableTrayCounter = Platform::IsLinux(); | bool gDisableTrayCounter = Platform::IsLinux(); | ||||||
| bool gUseTelegramPanelIcon = false; | bool gUseTelegramPanelIcon = false; | ||||||
| int gCustomAppIcon = 0; | int gCustomAppIcon = 0; | ||||||
|  |  | ||||||
|  | @ -7,6 +7,8 @@ https://github.com/kotatogram/kotatogram-desktop/blob/dev/LEGAL | ||||||
| */ | */ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include "platform/platform_file_utilities.h" | ||||||
|  | 
 | ||||||
| #define DeclareReadSetting(Type, Name) extern Type g##Name; \ | #define DeclareReadSetting(Type, Name) extern Type g##Name; \ | ||||||
| inline const Type &c##Name() { \ | inline const Type &c##Name() { \ | ||||||
| 	return g##Name; \ | 	return g##Name; \ | ||||||
|  | @ -102,6 +104,7 @@ void SetRecentStickersLimit(int limit); | ||||||
| DeclareSetting(int, UserpicCornersType); | DeclareSetting(int, UserpicCornersType); | ||||||
| DeclareSetting(bool, ShowTopBarUserpic); | DeclareSetting(bool, ShowTopBarUserpic); | ||||||
| DeclareSetting(bool, GtkIntegration); | DeclareSetting(bool, GtkIntegration); | ||||||
|  | DeclareSetting(Platform::FileDialog::ImplementationType, FileDialogType); | ||||||
| DeclareSetting(bool, DisableTrayCounter); | DeclareSetting(bool, DisableTrayCounter); | ||||||
| DeclareSetting(bool, UseTelegramPanelIcon); | DeclareSetting(bool, UseTelegramPanelIcon); | ||||||
| DeclareSetting(int, CustomAppIcon); | DeclareSetting(int, CustomAppIcon); | ||||||
|  |  | ||||||
|  | @ -41,6 +41,15 @@ namespace Settings { | ||||||
| 
 | 
 | ||||||
| namespace { | namespace { | ||||||
| 
 | 
 | ||||||
|  | QString FileDialogTypeLabel(int value) { | ||||||
|  | 	const auto typedValue = Platform::FileDialog::ImplementationType(value); | ||||||
|  | 	switch (typedValue) { | ||||||
|  | 	case Platform::FileDialog::ImplementationType::Default: | ||||||
|  | 		return tr::ktg_file_dialog_type_default(tr::now); | ||||||
|  | 	} | ||||||
|  | 	return Platform::FileDialog::ImplementationTypeLabel(typedValue); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| QString NetBoostLabel(int boost) { | QString NetBoostLabel(int boost) { | ||||||
| 	switch (boost) { | 	switch (boost) { | ||||||
| 		case 0: | 		case 0: | ||||||
|  | @ -457,6 +466,23 @@ void SetupKotatoSystem( | ||||||
| 	} | 	} | ||||||
| #endif // !DESKTOP_APP_DISABLE_GTK_INTEGRATION
 | #endif // !DESKTOP_APP_DISABLE_GTK_INTEGRATION
 | ||||||
| 
 | 
 | ||||||
|  | 	AddButtonWithLabel( | ||||||
|  | 		container, | ||||||
|  | 		tr::ktg_settings_file_dialog_type(), | ||||||
|  | 		rpl::single(FileDialogTypeLabel(int(cFileDialogType()))), | ||||||
|  | 		st::settingsButton | ||||||
|  | 	)->addClickHandler([=] { | ||||||
|  | 		Ui::show(Box<::Kotato::RadioBox>( | ||||||
|  | 			tr::ktg_settings_file_dialog_type(tr::now), | ||||||
|  | 			int(cFileDialogType()), | ||||||
|  | 			int(Platform::FileDialog::ImplementationType::Count), | ||||||
|  | 			FileDialogTypeLabel, | ||||||
|  | 			[=](int value) { | ||||||
|  | 				cSetFileDialogType(Platform::FileDialog::ImplementationType(value)); | ||||||
|  | 				::Kotato::JsonSettings::Write(); | ||||||
|  | 			}, false)); | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
| 	if (Platform::IsMac()) { | 	if (Platform::IsMac()) { | ||||||
| 		const auto useNativeDecorationsToggled = Ui::CreateChild<rpl::event_stream<bool>>( | 		const auto useNativeDecorationsToggled = Ui::CreateChild<rpl::event_stream<bool>>( | ||||||
| 			container.get()); | 			container.get()); | ||||||
|  |  | ||||||
|  | @ -159,6 +159,19 @@ bool GetQt( | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | QString ImplementationTypeLabel(ImplementationType value) { | ||||||
|  | 	switch (value) { | ||||||
|  | #ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION | ||||||
|  | 	case ImplementationType::XDP: return qsl("XDG Desktop Portal"); | ||||||
|  | #endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
 | ||||||
|  | #ifndef DESKTOP_APP_DISABLE_GTK_INTEGRATION | ||||||
|  | 	case ImplementationType::GTK: return qsl("GTK"); | ||||||
|  | #endif // !DESKTOP_APP_DISABLE_GTK_INTEGRATION
 | ||||||
|  | 	case ImplementationType::Qt: return qsl("Qt"); | ||||||
|  | 	} | ||||||
|  | 	Unexpected("Value in Platform::FileDialog::ImplementationTypeLabel."); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| bool Get( | bool Get( | ||||||
| 		QPointer<QWidget> parent, | 		QPointer<QWidget> parent, | ||||||
| 		QStringList &files, | 		QStringList &files, | ||||||
|  |  | ||||||
|  | @ -27,6 +27,18 @@ inline void PostprocessDownloaded(const QString &filepath) { | ||||||
| 
 | 
 | ||||||
| namespace FileDialog { | namespace FileDialog { | ||||||
| 
 | 
 | ||||||
|  | enum class ImplementationType { | ||||||
|  | 	Default, | ||||||
|  | #ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION | ||||||
|  | 	XDP, | ||||||
|  | #endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
 | ||||||
|  | #ifndef DESKTOP_APP_DISABLE_GTK_INTEGRATION | ||||||
|  | 	GTK, | ||||||
|  | #endif // !DESKTOP_APP_DISABLE_GTK_INTEGRATION
 | ||||||
|  | 	Qt, | ||||||
|  | 	Count, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| inline void InitLastPath() { | inline void InitLastPath() { | ||||||
| 	::FileDialog::internal::InitLastPathDefault(); | 	::FileDialog::internal::InitLastPathDefault(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -642,11 +642,12 @@ void GtkFileDialog::setNameFilters(const QStringList &filters) { | ||||||
| } // namespace
 | } // namespace
 | ||||||
| 
 | 
 | ||||||
| bool Use(Type type) { | bool Use(Type type) { | ||||||
| 	if (!Supported()) { | 	if (!Supported() | ||||||
|  | 		|| (cFileDialogType() > ImplementationType::GTK)) { | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return qEnvironmentVariableIsSet("TDESKTOP_USE_GTK_FILE_DIALOG") | 	return (cFileDialogType() == ImplementationType::GTK) | ||||||
| 		|| DesktopEnvironment::IsGtkBased(); | 		|| DesktopEnvironment::IsGtkBased(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -642,17 +642,18 @@ rpl::producer<> XDPFileDialog::rejected() { | ||||||
| } // namespace
 | } // namespace
 | ||||||
| 
 | 
 | ||||||
| bool Use(Type type) { | bool Use(Type type) { | ||||||
| 	static const auto ShouldUse = [&] { | 	const auto shouldUse = [&] { | ||||||
| 		const auto envVar = qEnvironmentVariableIsSet("TDESKTOP_USE_PORTAL"); | 		const auto setting = cFileDialogType() <= ImplementationType::XDP; | ||||||
|  | 		const auto forceSetting = cFileDialogType() == ImplementationType::XDP; | ||||||
| 		const auto confined = InFlatpak() || InSnap(); | 		const auto confined = InFlatpak() || InSnap(); | ||||||
| 		const auto notGtkBased = !DesktopEnvironment::IsGtkBased(); | 		const auto notGtkBased = !DesktopEnvironment::IsGtkBased(); | ||||||
| 
 | 
 | ||||||
| 		return confined || notGtkBased || envVar; | 		return setting && (confined || notGtkBased || forceSetting); | ||||||
| 	}(); | 	}(); | ||||||
| 
 | 
 | ||||||
| 	static const auto Version = FileChooserPortalVersion(); | 	static const auto Version = FileChooserPortalVersion(); | ||||||
| 
 | 
 | ||||||
| 	return ShouldUse | 	return shouldUse | ||||||
| 		&& Version.has_value() | 		&& Version.has_value() | ||||||
| 		&& (type != Type::ReadFolder || *Version >= 3); | 		&& (type != Type::ReadFolder || *Version >= 3); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -27,6 +27,15 @@ inline void PostprocessDownloaded(const QString &filepath) { | ||||||
| 
 | 
 | ||||||
| namespace FileDialog { | namespace FileDialog { | ||||||
| 
 | 
 | ||||||
|  | enum class ImplementationType { | ||||||
|  | 	Default, | ||||||
|  | 	Count, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | inline QString ImplementationTypeLabel(ImplementationType value) { | ||||||
|  | 	Unexpected("Value in Platform::FileDialog::TypeLabel."); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| inline void InitLastPath() { | inline void InitLastPath() { | ||||||
| 	::FileDialog::internal::InitLastPathDefault(); | 	::FileDialog::internal::InitLastPathDefault(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -27,6 +27,10 @@ void PostprocessDownloaded(const QString &filepath); | ||||||
| 
 | 
 | ||||||
| namespace FileDialog { | namespace FileDialog { | ||||||
| 
 | 
 | ||||||
|  | enum class ImplementationType; | ||||||
|  | 
 | ||||||
|  | QString ImplementationTypeLabel(ImplementationType value); | ||||||
|  | 
 | ||||||
| void InitLastPath(); | void InitLastPath(); | ||||||
| 
 | 
 | ||||||
| bool Get( | bool Get( | ||||||
|  |  | ||||||
|  | @ -12,6 +12,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | ||||||
| namespace Platform { | namespace Platform { | ||||||
| namespace File { | namespace File { | ||||||
| 
 | 
 | ||||||
|  | enum class ImplementationType { | ||||||
|  | 	Default, | ||||||
|  | 	Count, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | inline QString ImplementationTypeLabel(ImplementationType value) { | ||||||
|  | 	Unexpected("Value in Platform::FileDialog::TypeLabel."); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| inline QString UrlToLocal(const QUrl &url) { | inline QString UrlToLocal(const QUrl &url) { | ||||||
| 	return ::File::internal::UrlToLocalDefault(url); | 	return ::File::internal::UrlToLocalDefault(url); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Ilya Fedin
						Ilya Fedin