Skip to content

Commit f2d1b8d

Browse files
committed
FVKB-252: Highlight row in Table when it is being edited or "previewed"
1 parent 78e4a68 commit f2d1b8d

4 files changed

Lines changed: 107 additions & 1 deletion

File tree

kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genpurpose/control/table/PatternSemanticsTableControlSkin.java

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
import dev.ikm.komet.kview.mvvm.view.genpurpose.control.table.cell.SemanticComponentCollectionCell;
55
import dev.ikm.komet.kview.mvvm.view.genpurpose.control.table.cell.SemanticStandardCell;
66
import javafx.collections.ListChangeListener;
7+
import javafx.css.PseudoClass;
78
import javafx.scene.control.SkinBase;
89
import javafx.scene.control.TableColumn;
10+
import javafx.scene.control.TableRow;
911
import javafx.scene.control.TableView;
12+
import javafx.util.Callback;
13+
import javafx.util.Subscription;
1014

1115
import java.util.List;
1216

@@ -15,6 +19,8 @@
1519
import static dev.ikm.tinkar.terms.TinkarTerm.COMPONENT_ID_SET_FIELD;
1620

1721
public class PatternSemanticsTableControlSkin extends SkinBase<PatternSemanticsTableControl> {
22+
public static final PseudoClass EDIT_MODE_PSEUDO_CLASS = PseudoClass.getPseudoClass("edit-mode");
23+
public static final PseudoClass PREVIEW_MODE_PSEUDO_CLASS = PseudoClass.getPseudoClass("preview-mode");
1824

1925
private final TableView<SemanticRow> tableView = new TableView<>();
2026

@@ -25,13 +31,15 @@ public class PatternSemanticsTableControlSkin extends SkinBase<PatternSemanticsT
2531
*
2632
* @param control The control for which this Skin should attach to.
2733
*/
28-
protected PatternSemanticsTableControlSkin(PatternSemanticsTableControl control) {
34+
public PatternSemanticsTableControlSkin(PatternSemanticsTableControl control) {
2935
super(control);
3036

3137
getChildren().add(tableView);
3238

3339
tableView.setTableMenuButtonVisible(true);
3440

41+
tableView.setRowFactory(createRowFactory());
42+
3543
tableView.setItems(control.getSemantics());
3644

3745
control.getSemantics().addListener(this::onSemanticsChanged);
@@ -42,6 +50,41 @@ protected PatternSemanticsTableControlSkin(PatternSemanticsTableControl control)
4250
}
4351
}
4452

53+
private static Callback<TableView<SemanticRow>, TableRow<SemanticRow>> createRowFactory() {
54+
return new Callback<>() {
55+
private Subscription lastSubscription;
56+
57+
@Override
58+
public TableRow<SemanticRow> call(TableView<SemanticRow> semanticRowTableView) {
59+
TableRow<SemanticRow> row = new TableRow<>();
60+
61+
row.itemProperty().subscribe((oldItem, newItem) -> {
62+
if (oldItem != null) {
63+
if (lastSubscription != null) {
64+
lastSubscription.unsubscribe();
65+
}
66+
}
67+
68+
if (newItem != null) {
69+
lastSubscription = newItem.editModeProperty().subscribe(isEditMode -> {
70+
row.pseudoClassStateChanged(EDIT_MODE_PSEUDO_CLASS, isEditMode);
71+
});
72+
lastSubscription = Subscription.combine(lastSubscription,
73+
newItem.previewModeProperty().subscribe(isPreviewMode -> {
74+
row.pseudoClassStateChanged(PREVIEW_MODE_PSEUDO_CLASS, isPreviewMode);
75+
})
76+
);
77+
} else {
78+
row.pseudoClassStateChanged(EDIT_MODE_PSEUDO_CLASS, false);
79+
row.pseudoClassStateChanged(PREVIEW_MODE_PSEUDO_CLASS, false);
80+
}
81+
});
82+
83+
return row;
84+
}
85+
};
86+
}
87+
4588
private void onSemanticsChanged(ListChangeListener.Change<? extends SemanticRow> change) {
4689
while (change.next()) {
4790
if (change.wasAdded()) {

kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genpurpose/control/table/PatternSemanticsTablePresenter.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
import javafx.scene.Node;
2020

2121
import java.util.ArrayList;
22+
import java.util.HashMap;
2223
import java.util.List;
24+
import java.util.Map;
2325
import java.util.UUID;
2426

2527
public class PatternSemanticsTablePresenter implements PatternSemanticsPresenter {
@@ -31,6 +33,11 @@ public class PatternSemanticsTablePresenter implements PatternSemanticsPresenter
3133

3234
private final PatternSemanticsTableControl patternSemanticsControl;
3335

36+
private final Map<SemanticEntity<SemanticEntityVersion>, SemanticRow> semanticEntityToSemanticRow = new HashMap<>();
37+
38+
private SemanticRow previousSemanticRowPreviewMode;
39+
private SemanticRow previousSemanticRowEditMode;
40+
3441
public PatternSemanticsTablePresenter(EditorPatternModel editorPatternModel, ViewProperties viewProperties,
3542
ObservableComposer composer, UUID journalTopic) {
3643
this.composer = composer;
@@ -66,6 +73,8 @@ public void addNewSemantic(SemanticEntity<SemanticEntityVersion> semanticEntity)
6673
}
6774
SemanticRow semanticRow = new SemanticRow(fields);
6875

76+
semanticEntityToSemanticRow.put(semanticEntity, semanticRow);
77+
6978
patternSemanticsControl.getSemantics().add(semanticRow);
7079
}
7180

@@ -76,12 +85,30 @@ public void clearSemantics() {
7685

7786
@Override
7887
public void setPreviewingSemantic(SemanticEntity<SemanticEntityVersion> semanticEntity) {
88+
if (previousSemanticRowPreviewMode != null) {
89+
previousSemanticRowPreviewMode.setPreviewMode(false);
90+
}
7991

92+
SemanticRow semanticRow = semanticEntityToSemanticRow.get(semanticEntity);
93+
if (semanticRow != null) {
94+
semanticRow.setPreviewMode(true);
95+
}
96+
97+
previousSemanticRowPreviewMode = semanticRow;
8098
}
8199

82100
@Override
83101
public void setEditingSemantic(SemanticEntity<SemanticEntityVersion> semanticEntity) {
102+
if (previousSemanticRowEditMode != null) {
103+
previousSemanticRowEditMode.setEditMode(false);
104+
}
105+
106+
SemanticRow semanticRow = semanticEntityToSemanticRow.get(semanticEntity);
107+
if (semanticRow != null) {
108+
semanticRow.setEditMode(true);
109+
}
84110

111+
previousSemanticRowEditMode = semanticRow;
85112
}
86113

87114
@Override

kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genpurpose/control/table/SemanticRow.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package dev.ikm.komet.kview.mvvm.view.genpurpose.control.table;
22

3+
import javafx.beans.property.BooleanProperty;
4+
import javafx.beans.property.SimpleBooleanProperty;
5+
36
import java.util.List;
47

58
public class SemanticRow {
@@ -10,4 +13,16 @@ public SemanticRow(List<SemanticField> fields) {
1013
}
1114

1215
public List<SemanticField> getFields() { return fields; }
16+
17+
// -- edit mode
18+
BooleanProperty editMode = new SimpleBooleanProperty();
19+
public boolean isEditMode() { return editMode.get(); }
20+
public BooleanProperty editModeProperty() { return editMode; }
21+
public void setEditMode(boolean editMode) { this.editMode.set(editMode); }
22+
23+
// -- preview mode
24+
BooleanProperty previewMode = new SimpleBooleanProperty();
25+
public boolean isPreviewMode() { return previewMode.get(); }
26+
public BooleanProperty previewModeProperty() { return previewMode; }
27+
public void setPreviewMode(boolean previewMode) { this.previewMode.set(previewMode); }
1328
}

kview/src/main/resources/dev/ikm/komet/kview/mvvm/view/kview.css

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6589,6 +6589,12 @@ Styling a context menu for kview ui/ux controls
65896589
table_view_border_color: #ddd;
65906590
table_view_body_border_color: #e9e9e9;
65916591

6592+
edit_mode_background_color: #f4fbf0;
6593+
edit_mode_border_color: #66bb38;
6594+
6595+
preview_mode_background_color: #f4f4f4;
6596+
preview_mode_border_color: #dfdfdf;
6597+
65926598
-fx-cell-focus-inner-border: transparent;
65936599

65946600
-fx-faint-focus-color: transparent;
@@ -6644,12 +6650,27 @@ Styling a context menu for kview ui/ux controls
66446650
-fx-padding: 14px 10px 8px 10px;
66456651
}
66466652

6653+
.gen-purpose-window .table-view > .virtual-flow > .clipped-container > .sheet > .table-row-cell {
6654+
-fx-border-width: 1px;
6655+
-fx-border-color: transparent;
6656+
}
6657+
66476658
.gen-purpose-window .table-view > .virtual-flow > .clipped-container > .sheet > .table-row-cell .table-cell {
66486659
-fx-border-color: transparent table_view_body_border_color transparent transparent;
66496660
-fx-border-width: 1px;
66506661
-fx-border-insets: 0px 0px 0px 0px;
66516662
}
66526663

6664+
.gen-purpose-window .table-view > .virtual-flow > .clipped-container > .sheet > .table-row-cell:edit-mode {
6665+
-fx-background-color: edit_mode_background_color;
6666+
-fx-border-color: edit_mode_border_color;
6667+
}
6668+
6669+
.gen-purpose-window .table-view > .virtual-flow > .clipped-container > .sheet > .table-row-cell:preview-mode {
6670+
-fx-background-color: preview_mode_background_color;
6671+
-fx-border-color: preview_mode_border_color;
6672+
}
6673+
66536674
/* Data type COMPONENT_ID_SET_FIELD (Component Set), COMPONENT_FIELD (Component) */
66546675
.gen-purpose-window .table-view .table-cell .component-container {
66556676
-fx-spacing: 5px;

0 commit comments

Comments
 (0)