Skip to content

Commit 391e99c

Browse files
authored
Implement Component Groups (#1130)
Component groups allow nesting components in the opposite layout direction to their parent, enabling horizontal rows inside vertical layouts and vice versa. Groups can be nested arbitrarily deep, with the direction alternating at each level. The layout editor presents all components, including those nested inside groups, in a single flat list with indentation levels. Empty groups show placeholder entries. Adding, removing, moving, and duplicating components all work across group boundaries. The editor state exposes the layout direction at the selected position. Changelog (en): The layout editor now supports adding rows and columns of components, allowing for much more complex layouts. Changelog (de): Der Layout-Editor unterstützt jetzt das Hinzufügen von Zeilen und Spalten von Komponenten, was deutlich komplexere Layouts ermöglicht. Changelog (fr): L'éditeur de layout permet désormais d'ajouter des lignes et des colonnes de composants, permettant des mises en page bien plus complexes. Changelog (nl): De lay-outeditor ondersteunt nu het toevoegen van rijen en kolommen van componenten, waardoor veel complexere lay-outs mogelijk zijn. Changelog (es): El editor de diseño ahora permite añadir filas y columnas de componentes, lo que posibilita diseños mucho más complejos. Changelog (it): L'editor del layout ora supporta l'aggiunta di righe e colonne di componenti, consentendo layout molto più complessi. Changelog (pt): O editor de layout agora suporta adicionar linhas e colunas de componentes, permitindo layouts muito mais complexos. Changelog (pt-BR): O editor de layout agora suporta adicionar linhas e colunas de componentes, permitindo layouts muito mais complexos. Changelog (pl): Edytor układu obsługuje teraz dodawanie wierszy i kolumn komponentów, co umożliwia tworzenie znacznie bardziej złożonych układów. Changelog (ru): Редактор макета теперь поддерживает добавление строк и столбцов компонентов, что позволяет создавать гораздо более сложные макеты. Changelog (ja): レイアウトエディタでコンポーネントの行と列を追加できるようになり、より複雑なレイアウトが可能になりました。 Changelog (ko): 레이아웃 편집기에서 구성 요소의 행과 열을 추가할 수 있게 되어, 훨씬 더 복잡한 레이아웃을 만들 수 있습니다. Changelog (zh-Hans): 布局编辑器现在支持添加组件的行和列,从而实现更加复杂的布局。 Changelog (zh-Hant): 佈局編輯器現在支持添加組件的行和列,從而實現更加複雜的佈局。
1 parent 400b639 commit 391e99c

18 files changed

Lines changed: 154 additions & 2 deletions

livesplit-core

Submodule livesplit-core updated 69 files

src/css/LayoutEditor.module.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@
5656
cursor: pointer;
5757
}
5858

59+
.placeholder {
60+
font-style: italic;
61+
opacity: 0.5;
62+
}
63+
5964
.layoutContainer {
6065
margin-left: var(--ui-large-margin);
6166

src/localization/chinese-simplified.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,10 @@ export function resolveChineseSimplified(text: Label): string {
247247
case Label.ComponentBlankSpaceDescription: return "仅显示背景的空组件,用作间距。";
248248
case Label.ComponentSeparator: return "分隔线";
249249
case Label.ComponentSeparatorDescription: return "在组件之间渲染分隔线。";
250+
case Label.Row: return "行";
251+
case Label.RowDescription: return "一行水平排列的组件,改变内部组件的布局方向。";
252+
case Label.Column: return "列";
253+
case Label.ColumnDescription: return "一列垂直排列的组件,改变内部组件的布局方向。";
250254
case Label.AccuracySeconds: return "秒";
251255
case Label.AccuracyTenths: return "十分之一秒";
252256
case Label.AccuracyHundredths: return "百分之一秒";

src/localization/dutch.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,10 @@ export function resolveDutch(text: Label): string {
247247
case Label.ComponentBlankSpaceDescription: return "Leeg component voor padding tussen onderdelen.";
248248
case Label.ComponentSeparator: return "Scheiding";
249249
case Label.ComponentSeparatorDescription: return "Tekent een scheidingslijn tussen componenten.";
250+
case Label.Row: return "Rij";
251+
case Label.RowDescription: return "Een rij componenten die horizontaal zijn ingedeeld, waardoor de lay-outrichting voor de componenten binnenin verandert.";
252+
case Label.Column: return "Kolom";
253+
case Label.ColumnDescription: return "Een kolom componenten die verticaal zijn ingedeeld, waardoor de lay-outrichting voor de componenten binnenin verandert.";
250254
case Label.AccuracySeconds: return "Seconden";
251255
case Label.AccuracyTenths: return "Tienden";
252256
case Label.AccuracyHundredths: return "Honderdsten";

src/localization/english.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,10 @@ export function resolveEnglish(text: Label): string {
247247
case Label.ComponentBlankSpaceDescription: return "An empty component that doesn't show anything other than a background. It mostly serves as padding between other components.";
248248
case Label.ComponentSeparator: return "Separator";
249249
case Label.ComponentSeparatorDescription: return "A simple component that just renders a separator between components.";
250+
case Label.Row: return "Row";
251+
case Label.RowDescription: return "A row of components laid out horizontally, changing the layout direction for the components inside.";
252+
case Label.Column: return "Column";
253+
case Label.ColumnDescription: return "A column of components laid out vertically, changing the layout direction for the components inside.";
250254
case Label.AccuracySeconds: return "Seconds";
251255
case Label.AccuracyTenths: return "Tenths";
252256
case Label.AccuracyHundredths: return "Hundredths";

src/localization/french.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,10 @@ export function resolveFrench(text: Label): string {
247247
case Label.ComponentBlankSpaceDescription: return "Composant vide servant d’espacement.";
248248
case Label.ComponentSeparator: return "Séparateur";
249249
case Label.ComponentSeparatorDescription: return "Affiche un séparateur entre les composants.";
250+
case Label.Row: return "Ligne";
251+
case Label.RowDescription: return "Une ligne de composants disposés horizontalement, changeant la direction du layout pour les composants à l'intérieur.";
252+
case Label.Column: return "Colonne";
253+
case Label.ColumnDescription: return "Une colonne de composants disposés verticalement, changeant la direction du layout pour les composants à l'intérieur.";
250254
case Label.AccuracySeconds: return "Secondes";
251255
case Label.AccuracyTenths: return "Dixièmes";
252256
case Label.AccuracyHundredths: return "Centièmes";

src/localization/german.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,10 @@ export function resolveGerman(text: Label): string {
247247
case Label.ComponentBlankSpaceDescription: return "Leere Komponente als Abstand zwischen anderen.";
248248
case Label.ComponentSeparator: return "Trenner";
249249
case Label.ComponentSeparatorDescription: return "Zeichnet einen Trenner zwischen Komponenten.";
250+
case Label.Row: return "Zeile";
251+
case Label.RowDescription: return "Eine Zeile von Komponenten, die horizontal angeordnet sind und die Layoutrichtung für die enthaltenen Komponenten ändern.";
252+
case Label.Column: return "Spalte";
253+
case Label.ColumnDescription: return "Eine Spalte von Komponenten, die vertikal angeordnet sind und die Layoutrichtung für die enthaltenen Komponenten ändern.";
250254
case Label.AccuracySeconds: return "Sekunden";
251255
case Label.AccuracyTenths: return "Zehntel";
252256
case Label.AccuracyHundredths: return "Hundertstel";

src/localization/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,10 @@ export enum Label {
260260
ComponentBlankSpaceDescription,
261261
ComponentSeparator,
262262
ComponentSeparatorDescription,
263+
Row,
264+
RowDescription,
265+
Column,
266+
ColumnDescription,
263267
AccuracySeconds,
264268
AccuracyTenths,
265269
AccuracyHundredths,

src/localization/italian.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,10 @@ export function resolveItalian(text: Label): string {
247247
case Label.ComponentBlankSpaceDescription: return "Componente vuoto usato come spaziatura.";
248248
case Label.ComponentSeparator: return "Separatore";
249249
case Label.ComponentSeparatorDescription: return "Rende un separatore tra componenti.";
250+
case Label.Row: return "Riga";
251+
case Label.RowDescription: return "Una riga di componenti disposti orizzontalmente, che cambia la direzione del layout per i componenti al suo interno.";
252+
case Label.Column: return "Colonna";
253+
case Label.ColumnDescription: return "Una colonna di componenti disposti verticalmente, che cambia la direzione del layout per i componenti al suo interno.";
250254
case Label.AccuracySeconds: return "Secondi";
251255
case Label.AccuracyTenths: return "Decimi";
252256
case Label.AccuracyHundredths: return "Centesimi";

src/localization/japanese.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,10 @@ export function resolveJapanese(text: Label): string {
247247
case Label.ComponentBlankSpaceDescription: return "背景のみの空コンポーネントです。コンポーネント間の余白として使います。";
248248
case Label.ComponentSeparator: return "区切り";
249249
case Label.ComponentSeparatorDescription: return "コンポーネント間の区切り線を表示します。";
250+
case Label.Row: return "行";
251+
case Label.RowDescription: return "水平に配置されたコンポーネントの行で、内部のコンポーネントのレイアウト方向を変更します。";
252+
case Label.Column: return "列";
253+
case Label.ColumnDescription: return "垂直に配置されたコンポーネントの列で、内部のコンポーネントのレイアウト方向を変更します。";
250254
case Label.AccuracySeconds: return "秒";
251255
case Label.AccuracyTenths: return "1/10 秒";
252256
case Label.AccuracyHundredths: return "1/100 秒";

0 commit comments

Comments
 (0)