8142176f84
* Remove --medium-border variable * Implement color palette using Sass maps I hand-picked the gray tones, the other colors are from the Tailwind CSS v3 palette. Significant changes: - light theme is brighter - dark theme is darker - borders are softer I also deleted some platform- and night-mode-specific code. * Use custom colors for note view switch * Use same placeholder color for all inputs * Skew color palette for more dark values by removing gray[3], which wasn't used anywhere. Slight adjustments were made to the darker tones. * Adjust frame- window- and border colors * Give deck browser entries --frame-bg as background color * Define styling for QComboBox and QLineEdit globally * Experiment with CSS filter for inline-colors Inside darker inputs, some colors like dark blue will be hard to read, so we could try to improve text-color contrast with global adjustments depending on the theme. * Use different map structure for _vars.scss after @hgiesel's idea: https://github.com/ankitects/anki/pull/2016#discussion_r947087871 * Move custom QLineEdit styles out of searchbar.py * Merge branch 'main' into color-palette * Revert QComboBox stylesheet override * Align gray color palette more with macOS * Adjust light theme * Use --slightly-grey-text for options tab color * Replace gray tones with more neutral values * Improve categorization of global colors by renaming almost all of them and sorting them into separate maps. * Saturate highlight-bg in light theme * Tweak gray tones * Adjust box-shadow of EditingArea to make fields look inset * Add Sass functions to access color palette and semantic variables in response to https://github.com/ankitects/anki/pull/2016#issuecomment-1220571076 * Showcase use of access functions in several locations @hgiesel in buttons.scss I access the color palette directly. Is this what you meant by "... keep it local to the component, and possibly make it global at a later time ..."? * Fix focus box shadow transition and remove default shadow for a cleaner look I couldn't quite get the inset look the way I wanted, because inset box-shadows do not respect the border radius, therefore causing aliasing. * Tweak light theme border and shadow colors * Add functions and colors to base_lib * Add vars_lib as dependency to base_lib and button_mixins_lib * Improve uses of default-themed variables * Use old --frame-bg color and use darker tone for canvas-default * Return CSS var by default and add palette-of function for raw value * Showcase use of palette-of function The #{...} syntax is required only because the use cases are CSS var definitions. In other cases a simple palette-of(keyword, theme) would suffice. * Light theme: decrease brightness of canvas-default and adjust fg-default * Use canvas-inset variable for switch knob * Adjust light theme * Add back box-shadow to EditingArea * Light theme: darken background and flatten transition also set hue and saturation of gray-8 to 0 (like all the other grays). * Reduce flag colors to single default value * Tweak card/note accent colors * Experiment with inset look for fields again Is this too dark in night mode? It's the same color used for all other text inputs. * Dark theme: make border-default one shade darker * Tweak inset shadow color * Dark theme: make border-faint darker than canvas-default meaning two shades darker than it currently was. * Fix PlainTextInput not expanding * Dark theme: use less saturated flag colors * Adjust gray tones * Fix nested variables not getting extracted correctly * Rename canvas-outset to canvas-elevated * Light theme: darken canvas-default * Make canvas-elevated a bit darker * Rename variables and use them in various components * Refactor button mixins * Remove fusion vars from Anki * Adjust button gradients * Refactor button mixins * Fix deck browser table td background color * Use color function in buttons.scss * Rework QTabWidget stylesheet * Fix crash on browser open * Perfect QTableView header * Fix bottom toolbar button gradient * Fix focus outline of bottom toolbar buttons * Fix custom webview scrollbar * Fix uses of vars in various webviews The command @use vars as * lead to repeated inclusion of the CSS vars. * Enable primary button color with mixin * Run prettier * Fix Python code style issues * Tweak colors * Lighten scrollbar shades in light theme * Fix code style issues caused by merge * Fix harsh border color in editor caused by leftover --medium-border variables, probably introduced with a merge commit. * Compile Sass before extracting Python colors/props This means the Python side doesn't need to worry about the map structure and Sass functions, just copy the output CSS values. * Desaturate primary button colors by 10% * Convert accidentally capitalized variable names to lowercase * Simplify color definitions with qcolor function * Remove default border-focus variable * Remove redundant colon * Apply custom scrollbar CSS only on Windows and Linux * Make border-subtle color brighter than background in dark theme * Make border-subtle color a shade brighter in light theme * Use border-subtle for NoteEditor and EditorToolbar border * Small patches
117 lines
3.3 KiB
Python
117 lines
3.3 KiB
Python
# Copyright: Ankitects Pty Ltd and contributors
|
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|
from __future__ import annotations
|
|
|
|
import time
|
|
from dataclasses import dataclass
|
|
from typing import TYPE_CHECKING, Generator, Sequence, Union
|
|
|
|
import aqt
|
|
import aqt.browser
|
|
from anki.cards import CardId
|
|
from anki.collection import BrowserColumns as Columns
|
|
from anki.collection import BrowserRow
|
|
from anki.notes import NoteId
|
|
from aqt import colors
|
|
from aqt.qt import QColor
|
|
from aqt.utils import tr
|
|
|
|
Column = Columns.Column
|
|
ItemId = Union[CardId, NoteId]
|
|
ItemList = Union[Sequence[CardId], Sequence[NoteId]]
|
|
|
|
|
|
@dataclass
|
|
class SearchContext:
|
|
search: str
|
|
browser: aqt.browser.Browser
|
|
order: bool | str | Column = True
|
|
reverse: bool = False
|
|
# if set, provided ids will be used instead of the regular search
|
|
ids: Sequence[ItemId] | None = None
|
|
|
|
|
|
@dataclass
|
|
class Cell:
|
|
text: str
|
|
is_rtl: bool
|
|
|
|
|
|
class CellRow:
|
|
is_disabled: bool = False
|
|
|
|
def __init__(
|
|
self,
|
|
cells: Generator[tuple[str, bool], None, None],
|
|
color: BrowserRow.Color.V,
|
|
font_name: str,
|
|
font_size: int,
|
|
) -> None:
|
|
self.refreshed_at: float = time.time()
|
|
self.cells: tuple[Cell, ...] = tuple(Cell(*cell) for cell in cells)
|
|
self.color: tuple[str, str] | None = backend_color_to_aqt_color(color)
|
|
self.font_name: str = font_name or "arial"
|
|
self.font_size: int = font_size if font_size > 0 else 12
|
|
|
|
def is_stale(self, threshold: float) -> bool:
|
|
return self.refreshed_at < threshold
|
|
|
|
@staticmethod
|
|
def generic(length: int, cell_text: str) -> CellRow:
|
|
return CellRow(
|
|
((cell_text, False) for cell in range(length)),
|
|
BrowserRow.COLOR_DEFAULT,
|
|
"arial",
|
|
12,
|
|
)
|
|
|
|
@staticmethod
|
|
def placeholder(length: int) -> CellRow:
|
|
return CellRow.generic(length, "...")
|
|
|
|
@staticmethod
|
|
def disabled(length: int, cell_text: str) -> CellRow:
|
|
row = CellRow.generic(length, cell_text)
|
|
row.is_disabled = True
|
|
return row
|
|
|
|
|
|
def backend_color_to_aqt_color(color: BrowserRow.Color.V) -> tuple[str, str] | None:
|
|
temp_color = None
|
|
|
|
if color == BrowserRow.COLOR_MARKED:
|
|
temp_color = colors.STATE_MARKED
|
|
if color == BrowserRow.COLOR_SUSPENDED:
|
|
temp_color = colors.STATE_SUSPENDED
|
|
if color == BrowserRow.COLOR_FLAG_RED:
|
|
temp_color = colors.FLAG_1
|
|
if color == BrowserRow.COLOR_FLAG_ORANGE:
|
|
temp_color = colors.FLAG_2
|
|
if color == BrowserRow.COLOR_FLAG_GREEN:
|
|
temp_color = colors.FLAG_3
|
|
if color == BrowserRow.COLOR_FLAG_BLUE:
|
|
temp_color = colors.FLAG_4
|
|
if color == BrowserRow.COLOR_FLAG_PINK:
|
|
temp_color = colors.FLAG_5
|
|
if color == BrowserRow.COLOR_FLAG_TURQUOISE:
|
|
temp_color = colors.FLAG_6
|
|
if color == BrowserRow.COLOR_FLAG_PURPLE:
|
|
temp_color = colors.FLAG_7
|
|
|
|
return adjusted_bg_color(temp_color)
|
|
|
|
|
|
def adjusted_bg_color(color: tuple[str, str]) -> tuple[str, str]:
|
|
if color:
|
|
return (
|
|
QColor(color[0]).lighter(150).name(),
|
|
QColor(color[1]).darker(150).name(),
|
|
)
|
|
else:
|
|
return None
|
|
|
|
|
|
from .model import DataModel
|
|
from .state import CardState, ItemState, NoteState
|
|
from .table import StatusDelegate, Table
|