1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
|
/**************************************************************************
* *
* Regina - A Normal Surface Theory Calculator *
* Qt User Interface *
* *
* Copyright (c) 1999-2025, Ben Burton *
* For further details contact Ben Burton (bab@debian.org). *
* *
* This file is modified from the KDE syntax-highlighting framework, *
* which is copyright (C) 2016 Volker Krause <vkrause@kde.org> *
* and is distributed under the GNU Library General Public License as *
* published by the Free Software Foundation; either version 2 of the *
* License, or (at your option) any later version. *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of the *
* License, or (at your option) any later version. *
* *
* As an exception, when this program is distributed through (i) the *
* App Store by Apple Inc.; (ii) the Mac App Store by Apple Inc.; or *
* (iii) Google Play by Google Inc., then that store may impose any *
* digital rights management, device limits and/or redistribution *
* restrictions that are required by its terms of service. *
* *
* This program is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
* *
**************************************************************************/
/**
* \file syntax/theme.h
* \brief Part of the private syntax highlighting framework that is shared
* between Regina's different graphical user interfaces.
*
* The syntax highlighting headers are private in the following sense: they are
* not installed along with Regina's other headers, they do not appear in the
* API documentation, and the syntax highlighting API is subject to change
* without notice between different versions of Regina.
*/
#ifndef __SYNTAX_THEME_H
#ifndef __DOXYGEN
#define __SYNTAX_THEME_H
#endif
#include "regina-core.h"
#include <memory>
#include <string>
namespace regina::syntax {
class ThemeData;
class RepositoryPrivate;
/**
* Color theme definition used for highlighting.
*
* @section theme_intro Introduction
*
* The Theme provides a full color theme for painting the highlighted text.
* One Theme is defined as a *.theme file on disk. Each
* Theme has a unique name().
* Themes shipped by default are typically read-only, see isReadOnly().
*
* A Theme defines two sets of colors:
* - Text colors, including foreground and background colors, colors for
* selected text, and properties such as bold and italic. These colors are
* used e.g. by the SyntaxHighlighter.
* - Editor colors, including a background color for the entire editor widget,
* the line number color, etc.
*
* @section theme_text_colors Text Colors and the Class Format
*
* The text colors are used for syntax highlighting.
* // TODO: elaborate more and explain relation to Format class
*
* @section theme_editor_colors Editor Colors
*
* If you want to use the SyntaxHighlighting framework to write your own text
* editor, you also need to paint the background of the editing widget. In
* addition, the editor may support showing line numbers, a
* highlight for the current text line, and similar features. All these colors
* are defined in terms of the "editor colors" and accessible by calling
* editorColor() with the desired enum EditorColorRole.
*
* @section theme_access Accessing a Theme
*
* All available Theme%s are accessed through the Repository. These themes are
* typically valid themes. If you create a Theme on your own, isValid() will
* return @e false, and all colors provided by this Theme are in fact invalid
* and therefore unusable.
*
* @see Format
*/
class Theme
{
public:
/**
* Default styles that can be referenced from syntax definition XML files.
* Make sure to choose readable colors with good contrast especially in
* combination with the EditorColorRole%s.
*/
enum TextStyle {
//! Default text style for normal text and source code without
//! special highlighting.
Normal = 0,
//! Text style for language keywords.
Keyword,
//! Text style for function definitions and function calls.
Function,
//! Text style for variables, if applicable. For instance, variables in
//! PHP typically start with a '$', so all identifiers following the
//! pattern $foo are highlighted as variable.
Variable,
//! Text style for control flow highlighting, such as @e if, @e then,
//! @e else, @e return, or @e continue.
ControlFlow,
//! Text style for operators such as +, -, *, / and :: etc.
Operator,
//! Text style for built-in language classes and functions.
BuiltIn,
//! Text style for well-known extensions, such as boost.
Extension,
//! Text style for preprocessor statements.
Preprocessor,
//! Text style for attributes of functions or objects, e.g. \@override
//! in Java, or __declspec(...) and __attribute__((...)) in C++.
Attribute,
//! Text style for single characters such as 'a'.
Char,
//! Text style for escaped characters in strings, such as "hello\n".
SpecialChar,
//! Text style for strings, for instance "hello world".
String,
//! Text style for verbatim strings such as HERE docs.
VerbatimString,
//! Text style for special strings such as regular expressions in
//! ECMAScript or the LaTeX math mode.
SpecialString,
//! Text style for includes, imports, modules, or LaTeX packages.
Import,
//! Text style for data types such as int, char, float etc.
DataType,
//! Text style for decimal values.
DecVal,
//! Text style for numbers with base other than 10.
BaseN,
//! Text style for floating point numbers.
Float,
//! Text style for language constants, e.g. True, False, None in Python
//! or nullptr in C/C++.
Constant,
//! Text style for normal comments.
Comment,
//! Text style for comments that reflect API documentation, such as
//! doxygen /** */ comments.
Documentation,
//! Text style for annotations in comments, such as \@param in Doxygen
//! or JavaDoc.
Annotation,
//! Text style that refers to variables in a comment, such as after
//! \@param \<identifier\> in Doxygen or JavaDoc.
CommentVar,
//! Text style for region markers, typically defined by BEGIN/END.
RegionMarker,
//! Text style for information, such as the keyword \@note in Doxygen.
Information,
//! Text style for warnings, such as the keyword \@warning in Doxygen.
Warning,
//! Text style for comment specials such as TODO and WARNING in
//! comments.
Alert,
//! Text style indicating wrong syntax.
Error,
//! Text style for attributes that do not match any of the other default
//! styles.
Others
};
/**
* Editor color roles, used to paint line numbers, editor background etc.
* The colors typically should have good contrast with the colors used
* in the TextStyle%s.
*/
enum EditorColorRole {
//! Background color for the editing area.
BackgroundColor = 0,
//! Background color for selected text.
TextSelection,
//! Background color for the line of the current text cursor.
CurrentLine,
//! Background color for matching text while searching.
SearchHighlight,
//! Background color for replaced text for a search & replace action.
ReplaceHighlight,
//! Background color for matching bracket pairs (including quotes)
BracketMatching,
//! Foreground color for visualizing tabs and trailing spaces.
TabMarker,
//! Color used to underline spell check errors.
SpellChecking,
//! Color used to draw vertical indentation levels, typically a line.
IndentationLine,
//! Background color for the icon border.
IconBorder,
//! Foreground color for drawing the line numbers. This should have a
//! good contrast with the IconBorder background color.
LineNumbers,
//! Foreground color for drawing the current line number. This should
//! have a good contrast with the IconBorder background color.
CurrentLineNumber,
//! Color used in the icon border to indicate dynamically wrapped lines.
//! This color should have a good contrast with the IconBorder
//! background color.
WordWrapMarker,
//! Color used to draw a vertical line for marking changed lines.
ModifiedLines,
//! Color used to draw a vertical line for marking saved lines.
SavedLines,
//! Line color used to draw separator lines, e.g. at column 80 in the
//! text editor area.
Separator,
//! Background color for bookmarks.
MarkBookmark,
//! Background color for active breakpoints.
MarkBreakpointActive,
//! Background color for a reached breakpoint.
MarkBreakpointReached,
//! Background color for inactive (disabled) breakpoints.
MarkBreakpointDisabled,
//! Background color for marking the current execution position.
MarkExecution,
//! Background color for general warning marks.
MarkWarning,
//! Background color for general error marks.
MarkError,
//! Background color for text templates (snippets).
TemplateBackground,
//! Background color for all editable placeholders in text templates.
TemplatePlaceholder,
//! Background color for the currently active placeholder in text
//! templates.
TemplateFocusedPlaceholder,
//! Background color for read-only placeholders in text templates.
TemplateReadOnlyPlaceholder
};
/**
* Default constructor, creating an invalid Theme, see isValid().
*/
Theme();
/**
* Copy constructor, sharing the Theme data with @p copy.
*/
Theme(const Theme ©);
/**
* Destructor.
*/
~Theme();
/**
* Assignment operator, sharing the Theme data with @p other.
*/
Theme &operator=(const Theme &other);
/**
* Returns @c true if this is a valid Theme.
* If the theme is invalid, none of the returned colors are well-defined.
*/
bool isValid() const;
/**
* Returns the unique name of this Theme.
*/
const std::string& name() const;
/**
* Returns @c true if this Theme is read-only.
* Typically, themes that are shipped by default are read-only.
*/
bool isReadOnly() const;
/**
* Returns the full path and file name to this Theme.
*
* If the theme is invalid (isValid()), an empty string is returned.
*/
const std::string& filePath() const;
/**
* Returns the text color to be used for @p style.
* The color will be returned as an integer of the form #AARRGGBB.
* @c 0 is returned for styles that do not specify a text color,
* use the default text color in that case.
*/
unsigned textColor(TextStyle style) const;
/**
* Returns the selected text color to be used for @p style.
* The color will be returned as an integer of the form #AARRGGBB.
* @c 0 is returned for styles that do not specify a selected text color,
* use the default textColor() in that case.
*/
unsigned selectedTextColor(TextStyle style) const;
/**
* Returns the background color to be used for @p style.
* The color will be returned as an integer of the form #AARRGGBB.
* @c 0 is returned for styles that do not specify a background color,
* use the default background color in that case.
*/
unsigned backgroundColor(TextStyle style) const;
/**
* Returns the background color to be used for selected text for @p style.
* The color will be returned as an integer of the form #AARRGGBB.
* @c 0 is returned for styles that do not specify a background color,
* use the default backgroundColor() in that case.
*/
unsigned selectedBackgroundColor(TextStyle style) const;
/**
* Returns whether the given style should be shown in bold.
*/
bool isBold(TextStyle style) const;
/**
* Returns whether the given style should be shown in italic.
*/
bool isItalic(TextStyle style) const;
/**
* Returns whether the given style should be shown underlined.
*/
bool isUnderline(TextStyle style) const;
/**
* Returns whether the given style should be shown struck through.
*/
bool isStrikeThrough(TextStyle style) const;
/**
* Sorts themes alphabetically by name.
*/
bool operator < (const Theme& rhs) const;
public:
/**
* Returns the editor color for the requested @p role.
* The color will be returned as an integer of the form #AARRGGBB.
*/
unsigned editorColor(EditorColorRole role) const;
private:
/**
* Constructor taking a shared ThemeData instance.
*/
explicit Theme(ThemeData* data);
friend class RepositoryPrivate;
friend class ThemeData;
private:
/**
* Shared data holder.
*/
std::shared_ptr<ThemeData> m_data;
};
inline bool Theme::operator < (const Theme& rhs) const {
return name() < rhs.name();
}
} // namespace regina::syntax
#endif
|