372 lines
12 KiB
C++
372 lines
12 KiB
C++
/*
|
|
SPDX-FileCopyrightText: 2007-2008 Robert Knight <robertknight@gmail.com>
|
|
SPDX-FileCopyrightText: 2018 Harald Sitter <sitter@kde.org>
|
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#ifndef EDITPROFILEDIALOG_H
|
|
#define EDITPROFILEDIALOG_H
|
|
|
|
#include <QtGlobal>
|
|
// KDE
|
|
#include <KNSCore/Entry>
|
|
#include <KPageDialog>
|
|
|
|
// Konsole
|
|
#include "colorscheme/ColorScheme.h"
|
|
#include "colorscheme/ColorSchemeEditor.h"
|
|
#include "colorscheme/ColorSchemeViewDelegate.h"
|
|
#include "konsoleprivate_export.h"
|
|
|
|
#include "profile/Profile.h"
|
|
#include "profile/ProfileGroup.h"
|
|
|
|
#include "Enumeration.h"
|
|
#include "FontDialog.h"
|
|
#include "LabelsAligner.h"
|
|
#include "keyboardtranslator/KeyboardTranslatorManager.h"
|
|
|
|
class KPluralHandlingSpinBox;
|
|
class KLocalizedString;
|
|
class QItemSelectionModel;
|
|
class QTextCodec;
|
|
|
|
namespace Ui
|
|
{
|
|
class EditProfileGeneralPage;
|
|
class EditProfileTabsPage;
|
|
class EditProfileAppearancePage;
|
|
class EditProfileScrollingPage;
|
|
class EditProfileKeyboardPage;
|
|
class EditProfileMousePage;
|
|
class EditProfileAdvancedPage;
|
|
}
|
|
|
|
namespace Konsole
|
|
{
|
|
/**
|
|
* A dialog which allows the user to edit a profile.
|
|
* After the dialog is created, it can be initialized with the settings
|
|
* for a profile using setProfile(). When the user makes changes to the
|
|
* dialog and accepts the changes, the dialog will update the
|
|
* profile in the SessionManager by calling the SessionManager's
|
|
* changeProfile() method.
|
|
*
|
|
* Some changes made in the dialog are preview-only changes which cause
|
|
* the SessionManager's changeProfile() method to be called with
|
|
* the persistent argument set to false. These changes are then
|
|
* un-done when the dialog is closed.
|
|
*/
|
|
class KONSOLEPRIVATE_EXPORT EditProfileDialog : public KPageDialog
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
/** Constructs a new dialog with the specified parent. */
|
|
explicit EditProfileDialog(QWidget *parent = nullptr);
|
|
~EditProfileDialog() override;
|
|
|
|
enum InitialProfileState {
|
|
ExistingProfile,
|
|
NewProfile,
|
|
};
|
|
|
|
/**
|
|
* Initializes the dialog with the settings for the specified session
|
|
* type.
|
|
*
|
|
* When the dialog closes, the profile will be updated in the SessionManager
|
|
* with the altered settings.
|
|
*
|
|
* @param profile The profile to be edited
|
|
* @param state Indicates whether @p profile is an already existing profile
|
|
* or a new one being created
|
|
*/
|
|
void setProfile(const Profile::Ptr &profile, InitialProfileState state = EditProfileDialog::ExistingProfile);
|
|
|
|
/**
|
|
* Selects the text in the profile name edit area.
|
|
* When the dialog is being used to create a new profile,
|
|
* this can be used to draw the user's attention to the profile name
|
|
* and make it easy for them to change it.
|
|
*/
|
|
void selectProfileName();
|
|
|
|
public Q_SLOTS:
|
|
// reimplemented
|
|
void accept() override;
|
|
// reimplemented
|
|
void reject() override;
|
|
|
|
private Q_SLOTS:
|
|
QSize sizeHint() const override;
|
|
|
|
// sets up the specified tab page if necessary
|
|
void preparePage(KPageWidgetItem *current, KPageWidgetItem *before = nullptr);
|
|
|
|
// saves changes to profile
|
|
void save();
|
|
|
|
// general page
|
|
void selectInitialDir();
|
|
void selectIcon();
|
|
|
|
void profileNameChanged(const QString &name);
|
|
void initialDirChanged(const QString &dir);
|
|
void startInSameDir(bool);
|
|
void commandChanged(const QString &command);
|
|
void semanticUpDown(bool);
|
|
void semanticInputClick(bool enable);
|
|
|
|
// tab page
|
|
void tabTitleFormatChanged(const QString &format);
|
|
void remoteTabTitleFormatChanged(const QString &format);
|
|
void tabColorChanged(const QColor &color);
|
|
void silenceSecondsChanged(int);
|
|
|
|
void terminalColumnsEntryChanged(int);
|
|
void terminalRowsEntryChanged(int);
|
|
void showTerminalSizeHint(bool);
|
|
void setDimWhenInactive(bool);
|
|
void setDimValue(int value);
|
|
void setBorderWhenActive(bool);
|
|
void setFocusBorderColor(const QColor &color);
|
|
void showEnvironmentEditor();
|
|
|
|
// appearance page
|
|
void setAntialiasText(bool enable);
|
|
void setBoldIntense(bool enable);
|
|
void useFontLineCharacters(bool enable);
|
|
void useFontBrailleCharacters(bool enable);
|
|
void newColorScheme();
|
|
void editColorScheme();
|
|
void saveColorScheme(const ColorScheme &scheme, bool isNewScheme);
|
|
void removeColorScheme();
|
|
void setVerticalLine(bool);
|
|
void setVerticalLineColumn(int);
|
|
// void focusBorderColor();
|
|
void focusBorderColorChanged(const QColor &color);
|
|
void toggleBlinkingCursor(bool);
|
|
void setCursorShape(int);
|
|
void autoCursorColor();
|
|
void customCursorColor();
|
|
void customCursorColorChanged(const QColor &);
|
|
void customCursorTextColorChanged(const QColor &);
|
|
void terminalMarginChanged(int margin);
|
|
void lineSpacingChanged(int);
|
|
void setTerminalCenter(bool enable);
|
|
void togglebidiRendering(bool);
|
|
void togglebidiTableDirOverride(bool);
|
|
void togglebidiLineLTR(bool);
|
|
|
|
void gotNewColorSchemes(const QList<KNSCore::Entry> &changedEntries);
|
|
|
|
/**
|
|
* Deletes the selected colorscheme from the user's home dir location
|
|
* so that the original one from the system-wide location can be used
|
|
* instead
|
|
*/
|
|
void resetColorScheme();
|
|
|
|
void colorSchemeSelected();
|
|
void previewColorScheme(const QModelIndex &index);
|
|
void showFontDialog();
|
|
void showEmojiFontDialog();
|
|
void toggleMouseWheelZoom(bool enable);
|
|
|
|
// scrolling page
|
|
void historyModeChanged(Enum::HistoryModeEnum mode);
|
|
|
|
void historySizeChanged(int);
|
|
|
|
void scrollFullPage();
|
|
void scrollHalfPage();
|
|
void toggleHighlightScrolledLines(bool enable);
|
|
void toggleReflowLines(bool enable);
|
|
|
|
void toggleScrollbarMarkerColor(QColor color);
|
|
void toggleScrollbarMarkerSize(double pSize);
|
|
|
|
// keyboard page
|
|
void editKeyBinding();
|
|
void newKeyBinding();
|
|
void keyBindingSelected();
|
|
void removeKeyBinding();
|
|
void resetKeyBindings();
|
|
|
|
// mouse page
|
|
void toggleUnderlineFiles(bool enable);
|
|
void toggleUnderlineLinks(bool);
|
|
void toggleOpenLinksByDirectClick(bool);
|
|
void textEditorCmdEditLineChanged(const QString &text);
|
|
void toggleCtrlRequiredForDrag(bool);
|
|
void toggleDropUrlsAsText(bool);
|
|
void toggleCopyTextToClipboard(bool);
|
|
void toggleCopyTextAsHTML(bool);
|
|
void toggleTrimLeadingSpacesInSelectedText(bool);
|
|
void toggleTrimTrailingSpacesInSelectedText(bool);
|
|
void pasteFromX11Selection();
|
|
void pasteFromClipboard();
|
|
void toggleAlternateScrolling(bool enable);
|
|
void toggleAllowColorFilter(bool enable);
|
|
void toggleAllowMouseTracking(bool allow);
|
|
|
|
void TripleClickModeChanged(int);
|
|
void wordCharactersChanged(const QString &);
|
|
|
|
// advanced page
|
|
void toggleBlinkingText(bool);
|
|
void toggleFlowControl(bool);
|
|
void updateUrlHintsModifier(bool);
|
|
void toggleReverseUrlHints(bool);
|
|
|
|
void setDefaultCodec(QTextCodec *);
|
|
|
|
void setTextEditorCombo(const Profile::Ptr &profile);
|
|
|
|
void toggleAllowLinkEscapeSequence(bool);
|
|
void linkEscapeSequenceTextsChanged();
|
|
|
|
void peekPrimaryKeySequenceChanged();
|
|
|
|
void toggleWordMode(bool mode);
|
|
void toggleWordModeAttr(bool mode);
|
|
void toggleWordModeAscii(bool mode);
|
|
void toggleWordModeBrahmic(bool mode);
|
|
void toggleIgnoreWcWidth(bool ignore);
|
|
|
|
private:
|
|
Q_DISABLE_COPY(EditProfileDialog)
|
|
|
|
enum PageID {
|
|
GeneralPage = 0,
|
|
TabsPage,
|
|
AppearancePage,
|
|
ScrollingPage,
|
|
KeyboardPage,
|
|
MousePage,
|
|
AdvancedPage,
|
|
PagesCount,
|
|
};
|
|
|
|
// initialize various pages of the dialog
|
|
void setupGeneralPage(const Profile::Ptr &profile);
|
|
void setupTabsPage(const Profile::Ptr &profile);
|
|
void setupAppearancePage(const Profile::Ptr &profile);
|
|
void setupKeyboardPage(const Profile::Ptr &profile);
|
|
void setupScrollingPage(const Profile::Ptr &profile);
|
|
void setupAdvancedPage(const Profile::Ptr &profile);
|
|
void setupMousePage(const Profile::Ptr &profile);
|
|
|
|
void setMessageGeneralPage(const QString &msg);
|
|
|
|
int maxSpinBoxWidth(const KPluralHandlingSpinBox *spinBox, const KLocalizedString &suffix);
|
|
|
|
// Returns the name of the colorScheme used in the current profile
|
|
const QString currentColorSchemeName() const;
|
|
|
|
// select @p selectedColorSchemeName after the changes are saved
|
|
// in the colorScheme editor
|
|
void updateColorSchemeList(const QString &selectedColorSchemeName = QString());
|
|
|
|
void updateColorSchemeButtons();
|
|
|
|
// Convenience method
|
|
KeyboardTranslatorManager *_keyManager = KeyboardTranslatorManager::instance();
|
|
|
|
// Updates the key bindings list widget on the Keyboard tab and selects
|
|
// @p selectKeyBindingsName
|
|
void updateKeyBindingsList(const QString &selectKeyBindingsName = QString());
|
|
void updateKeyBindingsButtons();
|
|
void showKeyBindingEditor(bool isNewTranslator);
|
|
|
|
void showColorSchemeEditor(bool isNewScheme);
|
|
void closeColorSchemeEditor();
|
|
|
|
void preview(Profile::Property prop, const QVariant &value);
|
|
void unpreview(Profile::Property prop);
|
|
void unpreviewAll();
|
|
void enableIfNonEmptySelection(QWidget *widget, QItemSelectionModel *selectionModel);
|
|
|
|
void updateCaption(const Profile::Ptr &profile);
|
|
void updateTransparencyWarning();
|
|
|
|
void updateFontPreview(QFont font);
|
|
void updateEmojiFontPreview(QFont font);
|
|
|
|
// Update _tempProfile in a way of respecting the apply button.
|
|
// When used with some previewed property, this method should
|
|
// always come after the preview operation.
|
|
void updateTempProfileProperty(Profile::Property, const QVariant &value);
|
|
|
|
// helper method for clearing all _tempProfile properties and marking it hidden
|
|
void resetTempProfile();
|
|
|
|
// Enable or disable apply button, used only within
|
|
// updateTempProfileProperty() or when toggling the default profile.
|
|
void updateButtonApply();
|
|
|
|
static QString groupProfileNames(const ProfileGroup::Ptr &group, int maxLength = -1);
|
|
|
|
struct ButtonGroupOption {
|
|
QAbstractButton *button;
|
|
int value;
|
|
};
|
|
struct ButtonGroupOptions {
|
|
QButtonGroup *group;
|
|
Profile::Property profileProperty;
|
|
bool preview;
|
|
QVector<ButtonGroupOption> buttons;
|
|
};
|
|
void setupButtonGroup(const ButtonGroupOptions &options, const Profile::Ptr &profile);
|
|
|
|
// returns false if:
|
|
// - the profile name is empty
|
|
// - the name matches the name of an already existing profile
|
|
// - the existing profile config file is read-only
|
|
// otherwise returns true.
|
|
bool isProfileNameValid();
|
|
|
|
Ui::EditProfileGeneralPage *_generalUi = nullptr;
|
|
Ui::EditProfileTabsPage *_tabsUi = nullptr;
|
|
Ui::EditProfileAppearancePage *_appearanceUi = nullptr;
|
|
Ui::EditProfileScrollingPage *_scrollingUi = nullptr;
|
|
Ui::EditProfileKeyboardPage *_keyboardUi = nullptr;
|
|
Ui::EditProfileMousePage *_mouseUi = nullptr;
|
|
Ui::EditProfileAdvancedPage *_advancedUi = nullptr;
|
|
|
|
using PageSetupMethod = void (EditProfileDialog::*)(const Profile::Ptr &);
|
|
struct Page {
|
|
Page(PageSetupMethod page = nullptr, bool update = false)
|
|
: setupPage(page)
|
|
, needsUpdate(update)
|
|
{
|
|
}
|
|
|
|
PageSetupMethod setupPage;
|
|
bool needsUpdate;
|
|
};
|
|
|
|
QMap<KPageWidgetItem *, Page> _pages;
|
|
KPageWidgetItem *_generalPageItem = nullptr;
|
|
|
|
Profile::Ptr _tempProfile;
|
|
Profile::Ptr _profile;
|
|
|
|
bool _isDefault = false;
|
|
|
|
Profile::PropertyMap _previewedProperties;
|
|
|
|
ColorSchemeEditor *_colorDialog = nullptr;
|
|
QDialogButtonBox *_buttonBox = nullptr;
|
|
FontDialog *_fontDialog = nullptr;
|
|
FontDialog *_emojiFontDialog = nullptr;
|
|
|
|
InitialProfileState _profileState = ExistingProfile;
|
|
};
|
|
|
|
}
|
|
|
|
#endif // EDITPROFILEDIALOG_H
|