mirror of
https://github.com/microsoft/terminal.git
synced 2026-05-20 13:57:43 +00:00
## Summary of the Pull Request This PR introduces a new profile setting, `dragDropDelimiter`, which allows users to configure the string separator used when dragging and dropping multiple files into the terminal. The default behavior remains a single space (`" "`) for backward compatibility. ## References and Relevant Issues * Closes #19565 ## Detailed Description of the Pull Request / Additional comments **Implementation Details:** * **Settings:** Added `DragDropDelimiter` to `MTSMSettings.h` and `Profile.idl`. * **Control:** Wired the setting through `ControlProperties.h` so the terminal logic can see it. * **Logic:** Updated `TermControl::OnDrop` to use the new delimiter when joining paths. * **UI:** Added the text box in the Advanced Settings page and updated the ViewModel. ## Validation Steps Performed * **Manual Verification:** * Verified default behavior (space separator) works as before. * Configured `dragDropDelimiter` to `", "`, `";"`, and custom strings in `settings.json` and from settings UI. * Confirmed dropped files are joined correctly. * **Build:** Validated that the solution builds cleanly. ## Notes for Reviewers 1. **Delimiter Length:** Currently, there is no limit on the maximum length of the delimiter string. Let me know if this should be changed. 3. **Localization:** I changed only `Resources/en-US` file. 4. **ViewModel:** In `ProfileViewModel.cpp`, I added the `else if` block for the new setting, but left it empty because no other UI logic currently depends on it. ## PR Checklist - [x] Closes #19565 - [ ] Documentation updated - [x] Schema updated (if necessary)
190 lines
8.7 KiB
C++
190 lines
8.7 KiB
C++
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
#pragma once
|
|
|
|
#include "DeleteProfileEventArgs.g.h"
|
|
#include "BellSoundViewModel.g.h"
|
|
#include "ProfileViewModel.g.h"
|
|
#include "Utils.h"
|
|
#include "ViewModelHelpers.h"
|
|
|
|
namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|
{
|
|
struct BellSoundViewModel : BellSoundViewModelT<BellSoundViewModel>, ViewModelHelper<BellSoundViewModel>
|
|
{
|
|
public:
|
|
BellSoundViewModel(const Model::IMediaResource& resource);
|
|
|
|
hstring Path() const { return _resource.Path(); }
|
|
bool FileExists() const { return _resource.Ok(); }
|
|
hstring DisplayPath() const;
|
|
hstring SubText() const;
|
|
VIEW_MODEL_OBSERVABLE_PROPERTY(bool, ShowDirectory);
|
|
|
|
private:
|
|
Model::IMediaResource _resource;
|
|
};
|
|
|
|
struct ProfileViewModel : ProfileViewModelT<ProfileViewModel>, ViewModelHelper<ProfileViewModel>
|
|
{
|
|
public:
|
|
// font face
|
|
static void UpdateFontList() noexcept;
|
|
static Windows::Foundation::Collections::IObservableVector<Editor::Font> CompleteFontList() noexcept { return _FontList; };
|
|
static Windows::Foundation::Collections::IObservableVector<Editor::Font> MonospaceFontList() noexcept { return _MonospaceFontList; };
|
|
|
|
ProfileViewModel(const Model::Profile& profile, const Model::CascadiaSettings& settings, const Windows::UI::Core::CoreDispatcher& dispatcher);
|
|
Control::IControlSettings TermSettings() const;
|
|
void DeleteProfile();
|
|
|
|
void SetupAppearances(Windows::Foundation::Collections::IObservableVector<Editor::ColorSchemeViewModel> schemesList);
|
|
|
|
// bell style bits
|
|
hstring BellStylePreview() const;
|
|
bool IsBellStyleFlagSet(const uint32_t flag);
|
|
void SetBellStyleAudible(winrt::Windows::Foundation::IReference<bool> on);
|
|
void SetBellStyleWindow(winrt::Windows::Foundation::IReference<bool> on);
|
|
void SetBellStyleTaskbar(winrt::Windows::Foundation::IReference<bool> on);
|
|
|
|
hstring BellSoundPreview();
|
|
void RequestAddBellSound(hstring path);
|
|
void RequestDeleteBellSound(const Editor::BellSoundViewModel& vm);
|
|
|
|
void SetAcrylicOpacityPercentageValue(double value)
|
|
{
|
|
Opacity(static_cast<float>(value) / 100.0f);
|
|
};
|
|
|
|
void LeftPadding(double value) noexcept;
|
|
double LeftPadding() const noexcept;
|
|
void TopPadding(double value) noexcept;
|
|
double TopPadding() const noexcept;
|
|
void RightPadding(double value) noexcept;
|
|
double RightPadding() const noexcept;
|
|
void BottomPadding(double value) noexcept;
|
|
double BottomPadding() const noexcept;
|
|
|
|
winrt::hstring EvaluatedIcon() const
|
|
{
|
|
return _profile.Icon().Resolved();
|
|
}
|
|
Windows::UI::Xaml::Controls::IconElement IconPreview() const;
|
|
winrt::hstring LocalizedIcon() const;
|
|
winrt::hstring IconPath() const { return _profile.Icon().Path(); }
|
|
void IconPath(const winrt::hstring& path)
|
|
{
|
|
Icon(Model::MediaResourceHelper::FromString(path));
|
|
_NotifyChanges(L"Icon", L"IconPath");
|
|
}
|
|
bool UsingNoIcon() const noexcept;
|
|
|
|
// starting directory
|
|
hstring CurrentStartingDirectoryPreview() const;
|
|
bool UseParentProcessDirectory() const;
|
|
void UseParentProcessDirectory(const bool useParent);
|
|
|
|
// general profile knowledge
|
|
winrt::guid OriginalProfileGuid() const noexcept;
|
|
bool CanDeleteProfile() const;
|
|
Editor::AppearanceViewModel DefaultAppearance() const;
|
|
Editor::AppearanceViewModel UnfocusedAppearance() const;
|
|
bool HasUnfocusedAppearance();
|
|
bool EditableUnfocusedAppearance() const noexcept;
|
|
bool ShowUnfocusedAppearance();
|
|
void CreateUnfocusedAppearance();
|
|
void DeleteUnfocusedAppearance();
|
|
|
|
bool ShowMarksAvailable() const noexcept;
|
|
bool AutoMarkPromptsAvailable() const noexcept;
|
|
bool RepositionCursorWithMouseAvailable() const noexcept;
|
|
|
|
bool Orphaned() const;
|
|
hstring TabTitlePreview() const;
|
|
hstring AnswerbackMessagePreview() const;
|
|
Windows::UI::Color TabColorPreview() const;
|
|
Windows::UI::Color TabThemeColorPreview() const;
|
|
|
|
til::typed_event<Editor::ProfileViewModel, Editor::DeleteProfileEventArgs> DeleteProfileRequested;
|
|
|
|
VIEW_MODEL_OBSERVABLE_PROPERTY(ProfileSubPage, CurrentPage);
|
|
VIEW_MODEL_OBSERVABLE_PROPERTY(Windows::Foundation::Collections::IObservableVector<Editor::BellSoundViewModel>, CurrentBellSounds);
|
|
|
|
PERMANENT_OBSERVABLE_PROJECTED_SETTING(_profile, Guid);
|
|
PERMANENT_OBSERVABLE_PROJECTED_SETTING(_profile, ConnectionType);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, Name);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, Source);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, Hidden);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, Icon);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, CloseOnExit);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, TabTitle);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, TabColor);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, SuppressApplicationTitle);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, ScrollState);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, Padding);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, Commandline);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, StartingDirectory);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, AntialiasingMode);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile.DefaultAppearance(), Opacity);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile.DefaultAppearance(), UseAcrylic);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, HistorySize);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, SnapOnInput);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, AltGrAliasing);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, BellStyle);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, BellSound);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, Elevate);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, ReloadEnvironmentVariables);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, RightClickContextMenu);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, ShowMarks);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, AutoMarkPrompts);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, RepositionCursorWithMouse);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, ForceVTInput);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, AllowKittyKeyboardMode);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, AllowVtChecksumReport);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, AllowVtClipboardWrite);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, AnswerbackMessage);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, RainbowSuggestions);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, PathTranslationStyle);
|
|
OBSERVABLE_PROJECTED_SETTING(_profile, DragDropDelimiter);
|
|
|
|
WINRT_PROPERTY(bool, IsBaseLayer, false);
|
|
WINRT_PROPERTY(bool, FocusDeleteButton, false);
|
|
GETSET_BINDABLE_ENUM_SETTING(AntiAliasingMode, Microsoft::Terminal::Control::TextAntialiasingMode, AntialiasingMode);
|
|
GETSET_BINDABLE_ENUM_SETTING(CloseOnExitMode, Microsoft::Terminal::Settings::Model::CloseOnExitMode, CloseOnExit);
|
|
GETSET_BINDABLE_ENUM_SETTING(ScrollState, Microsoft::Terminal::Control::ScrollbarState, ScrollState);
|
|
GETSET_BINDABLE_ENUM_SETTING(PathTranslationStyle, Microsoft::Terminal::Control::PathTranslationStyle, PathTranslationStyle);
|
|
|
|
private:
|
|
Model::Profile _profile;
|
|
winrt::guid _originalProfileGuid{};
|
|
winrt::hstring _lastBgImagePath;
|
|
winrt::hstring _lastStartingDirectoryPath;
|
|
Editor::AppearanceViewModel _defaultAppearanceViewModel;
|
|
Windows::UI::Core::CoreDispatcher _dispatcher;
|
|
|
|
winrt::Windows::UI::Xaml::Thickness _parsedPadding;
|
|
|
|
void _InitializeCurrentBellSounds();
|
|
void _PrepareModelForBellSoundModification();
|
|
void _MarkDuplicateBellSoundDirectories();
|
|
static Windows::Foundation::Collections::IObservableVector<Editor::Font> _MonospaceFontList;
|
|
static Windows::Foundation::Collections::IObservableVector<Editor::Font> _FontList;
|
|
|
|
Model::CascadiaSettings _appSettings;
|
|
Editor::AppearanceViewModel _unfocusedAppearanceViewModel;
|
|
};
|
|
|
|
struct DeleteProfileEventArgs :
|
|
public DeleteProfileEventArgsT<DeleteProfileEventArgs>
|
|
{
|
|
public:
|
|
DeleteProfileEventArgs(guid profileGuid) :
|
|
_ProfileGuid(profileGuid) {}
|
|
|
|
guid ProfileGuid() const noexcept { return _ProfileGuid; }
|
|
|
|
private:
|
|
guid _ProfileGuid{};
|
|
};
|
|
};
|