Skip to content

Commit 5a71c3e

Browse files
authored
Merge pull request #3838 from ControlSystemStudio/PR_3725
Change Data Browser area opacity in Properties Misc tab
2 parents a5ec298 + a4241c7 commit 5a71c3e

15 files changed

Lines changed: 475 additions & 226 deletions

File tree

app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public class Messages
3737
AddPV_PeriodTT,
3838
AppendSearchResults,
3939
AppendSearchResultsTT,
40+
AreaOpacity,
41+
AreaOpacityTT,
4042
ArchiveFetchDetailFmt,
4143
ArchiveFetchJobFmt,
4244
ArchiveFetchProgressFmt,

app/databrowser/src/main/java/org/csstudio/trends/databrowser3/model/Model.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ public class Model
9999
/** Background color */
100100
private volatile Color background = Color.WHITE;
101101

102+
/**
103+
* Area opacity, common for all plots.
104+
*/
105+
private volatile int areaOpacity = Preferences.opacity;
106+
102107
/** Title font */
103108
private volatile Font title_font = Font.font("Liberation Sans", FontWeight.BOLD, 20);
104109

@@ -426,7 +431,7 @@ else if (j < i) {
426431
item.fireItemLookChanged(); // Prevents the "Axis" UI-setting (under the "Traces" tab) from sometimes not displaying in the UI when moving axes.
427432
}
428433
}
429-
};
434+
}
430435

431436
/** @return How should plot rescale after archived data arrived? */
432437
public ArchiveRescale getArchiveRescale()
@@ -1009,4 +1014,16 @@ public ModelItem getItemByUniqueId(String uniqueId){
10091014
}
10101015
return items.stream().filter(item -> uniqueId.equals(item.getUniqueId())).findAny().orElse(null);
10111016
}
1017+
1018+
public int getAreaOpacity(){
1019+
return areaOpacity;
1020+
}
1021+
1022+
public void setAreaOpacity(int areaOpacity){
1023+
this.areaOpacity = areaOpacity;
1024+
getItems().forEach(item -> {
1025+
for (ModelListener listener : listeners)
1026+
listener.changedItemLook(item);
1027+
});
1028+
}
10121029
}

app/databrowser/src/main/java/org/csstudio/trends/databrowser3/model/ModelItem.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ abstract public class ModelItem
5757
*/
5858
private volatile Color color = null;
5959

60+
/** RGB for item's area color
61+
*/
62+
private volatile Color areaColor = null;
63+
6064
/** How to display the trace */
6165
private volatile TraceType trace_type = Preferences.trace_type;
6266

app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/plot/ModelBasedPlot.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public class ModelBasedPlot
7979
public ModelBasedPlot(final boolean active)
8080
{
8181
plot = new RTTimePlot(active);
82-
plot.setOpacity(Preferences.opacity);
82+
plot.setAreaOpacity(Preferences.opacity);
8383
plot.showLegend(false);
8484

8585
final Button time_config_button =
@@ -368,6 +368,7 @@ public void updateTrace(final ModelItem item)
368368
// These happen to not cause an immediate redraw, so
369369
// set even if no change
370370
trace.setColor(item.getPaintColor());
371+
plot.setAreaOpacity(item.getModel().get().getAreaOpacity());
371372
trace.setType(item.getTraceType());
372373
trace.setWidth(item.getLineWidth());
373374
trace.setLineStyle(item.getLineStyle());

app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/FontButton.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,13 @@ public class FontButton extends Button
4545
italic = new CheckBox(Messages.FontBtnItalics);
4646
private TextField example = new TextField(Messages.FontBtnExample);
4747

48-
private final PopOver popover;
48+
private PopOver popover;
4949

5050
private Font font;
51-
private final Consumer<Font> on_font_selected;
51+
private Consumer<Font> on_font_selected;
52+
53+
public FontButton(){
54+
}
5255

5356
/** @param initial_font Intiial font
5457
* @param on_font_selected Callback for selected font

app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/MiscTab.java

Lines changed: 23 additions & 189 deletions
Original file line numberDiff line numberDiff line change
@@ -7,213 +7,47 @@
77
******************************************************************************/
88
package org.csstudio.trends.databrowser3.ui.properties;
99

10-
import java.time.Duration;
10+
import java.io.IOException;
11+
import java.util.ResourceBundle;
1112

13+
import javafx.fxml.FXMLLoader;
1214
import org.csstudio.trends.databrowser3.Messages;
1315
import org.csstudio.trends.databrowser3.model.Model;
14-
import org.csstudio.trends.databrowser3.model.ModelListener;
16+
import org.phoebus.framework.nls.NLS;
1517
import org.phoebus.ui.undo.UndoableActionManager;
1618

17-
import javafx.geometry.Insets;
18-
import javafx.scene.control.CheckBox;
19-
import javafx.scene.control.ColorPicker;
20-
import javafx.scene.control.Label;
2119
import javafx.scene.control.Tab;
22-
import javafx.scene.control.TextField;
23-
import javafx.scene.control.Tooltip;
24-
import javafx.scene.layout.GridPane;
2520

2621
/** Property tab for misc. items
2722
* @author Kay Kasemir
2823
*/
2924
@SuppressWarnings("nls")
3025
public class MiscTab extends Tab
3126
{
32-
private final Model model;
33-
34-
/** Flag to prevent recursion when this tab updates the model and thus triggers the model_listener */
35-
private boolean updating = false;
36-
37-
private final TextField title = new TextField(), update_period = new TextField(), scroll_step = new TextField();
38-
private CheckBox save_changes = new CheckBox(), show_legend = new CheckBox();
39-
private ColorPicker foreground = new ColorPicker(), background = new ColorPicker();
40-
private FontButton title_font, label_font, scale_font, legend_font;
41-
42-
/** Update Tab when model changes (undo, ...) */
43-
private ModelListener model_listener = new ModelListener()
44-
{
45-
@Override
46-
public void changedSaveChangesBehavior(boolean do_save_changes)
47-
{
48-
if (updating)
49-
return;
50-
save_changes.setSelected(do_save_changes);
51-
}
52-
53-
@Override
54-
public void changedLayout()
55-
{
56-
if (updating)
57-
return;
58-
show_legend.setSelected(model.isLegendVisible());
59-
}
60-
61-
@Override
62-
public void changedTitle()
63-
{
64-
if (updating)
65-
return;
66-
title.setText(model.getTitle().orElse(""));
67-
}
68-
69-
@Override
70-
public void changedColorsOrFonts()
71-
{
72-
if (updating)
73-
return;
74-
foreground.setValue(model.getPlotForeground());
75-
background.setValue(model.getPlotBackground());
76-
title_font.selectFont(model.getTitleFont());
77-
label_font.selectFont(model.getLabelFont());
78-
scale_font.selectFont(model.getScaleFont());
79-
legend_font.selectFont(model.getLegendFont());
80-
}
81-
82-
@Override
83-
public void changedTiming()
84-
{
85-
if (updating)
86-
return;
87-
update_period.setText(Double.toString(model.getUpdatePeriod()));
88-
scroll_step.setText(Double.toString(model.getScrollStep().toMillis() / 1000.0));
89-
}
90-
};
91-
92-
9327
MiscTab(final Model model, final UndoableActionManager undo)
9428
{
95-
super(Messages.Miscellaneous);
96-
this.model = model;
97-
98-
final GridPane layout = new GridPane();
99-
layout.setHgap(5);
100-
layout.setVgap(5);
101-
layout.setPadding(new Insets(5));
102-
// layout.setGridLinesVisible(true); // Debug layout
103-
104-
105-
layout.add(new Label(Messages.TitleLbl), 0, 0);
106-
title.setTooltip(new Tooltip(Messages.TitleTT));
107-
title.setOnAction(event ->
108-
{
109-
updating = true;
110-
new ChangeTitleCommand(model, undo, title.getText());
111-
updating = false;
112-
});
113-
layout.add(title, 1, 0);
11429

115-
layout.add(new Label(Messages.UpdatePeriodLbl), 0, 1);
116-
layout.add(update_period, 1, 1);
117-
update_period.setOnAction(event ->
118-
{
119-
updating = true;
120-
final double period = Double.parseDouble(update_period.getText().trim());
121-
new ChangeUpdatePeriodCommand(model, undo, period);
122-
updating = false;
123-
});
124-
125-
layout.add(new Label(Messages.ScrollStepLbl), 0, 2);
126-
layout.add(scroll_step, 1, 2);
127-
scroll_step.setOnAction(event ->
128-
{
129-
updating = true;
130-
try
131-
{
132-
final Duration step = Duration.ofMillis(
133-
Math.round( Double.parseDouble(scroll_step.getText().trim()) * 1000.0 ) );
134-
new ChangeScrollStepCommand(model, undo, step);
135-
}
136-
catch (Exception ex)
137-
{
138-
scroll_step.setText(Double.toString(model.getScrollStep().toMillis() / 1000.0));
30+
super(Messages.Miscellaneous);
31+
ResourceBundle resourceBundle = NLS.getMessages(Messages.class);
32+
FXMLLoader loader = new FXMLLoader();
33+
loader.setResources(resourceBundle);
34+
loader.setLocation(this.getClass().getResource("MiscTab.fxml"));
35+
36+
loader.setControllerFactory(clazz -> {
37+
if(clazz.isAssignableFrom(MiscTabController.class)){
38+
try {
39+
return clazz.getConstructor(Model.class, UndoableActionManager.class).newInstance(model, undo);
40+
} catch (Exception e) {
41+
throw new RuntimeException(e);
42+
}
13943
}
140-
updating = false;
141-
});
142-
143-
layout.add(new Label(Messages.ForegroundColorLbl), 0, 3);
144-
foreground.setStyle("-fx-color-label-visible: false ;");
145-
layout.add(foreground, 1, 3);
146-
foreground.setValue(model.getPlotForeground());
147-
foreground.setOnAction(event ->
148-
{
149-
updating = true;
150-
new ChangePlotForegroundCommand(model, undo, foreground.getValue());
151-
updating = false;
152-
});
153-
154-
layout.add(new Label(Messages.BackgroundColorLbl), 0, 4);
155-
background.setStyle("-fx-color-label-visible: false ;");
156-
layout.add(background, 1, 4);
157-
background.setValue(model.getPlotBackground());
158-
background.setOnAction(event ->
159-
{
160-
updating = true;
161-
new ChangePlotBackgroundCommand(model, undo, background.getValue());
162-
updating = false;
163-
});
164-
165-
layout.add(new Label(Messages.SaveChangesLbl), 0, 5);
166-
save_changes.setTooltip(new Tooltip(Messages.SaveChangesTT));
167-
save_changes.setOnAction(event ->
168-
{
169-
updating = true;
170-
new ChangeSaveChangesCommand(model, undo, save_changes.isSelected());
171-
updating = false;
44+
return null;
17245
});
173-
layout.add(save_changes, 1, 5);
17446

175-
layout.add(new Label(Messages.TitleFontLbl), 2, 0);
176-
title_font = new FontButton(model.getTitleFont(),
177-
font -> new ChangeFontCommand(model, undo, model.getTitleFont(), font, (m, f) -> m.setTitleFont(f)));
178-
title_font.setMaxWidth(Double.MAX_VALUE);
179-
layout.add(title_font, 3, 0);
180-
181-
layout.add(new Label(Messages.LabelFontLbl), 2, 1);
182-
label_font = new FontButton(model.getLabelFont(),
183-
font -> new ChangeFontCommand(model, undo, model.getLabelFont(), font, (m, f) -> m.setLabelFont(f)));
184-
label_font.setMaxWidth(Double.MAX_VALUE);
185-
layout.add(label_font, 3, 1);
186-
187-
layout.add(new Label(Messages.ScaleFontLbl), 2, 2);
188-
scale_font = new FontButton(model.getScaleFont(),
189-
font -> new ChangeFontCommand(model, undo, model.getScaleFont(), font, (m, f) -> m.setScaleFont(f)));
190-
scale_font.setMaxWidth(Double.MAX_VALUE);
191-
layout.add(scale_font, 3, 2);
192-
193-
layout.add(new Label(Messages.LegendFontLbl), 2, 3);
194-
legend_font = new FontButton(model.getLegendFont(),
195-
font -> new ChangeFontCommand(model, undo, model.getLegendFont(), font, (m, f) -> m.setLegendFont(f)));
196-
legend_font.setMaxWidth(Double.MAX_VALUE);
197-
layout.add(legend_font, 3, 3);
198-
199-
layout.add(new Label(Messages.LegendLbl), 2, 4);
200-
show_legend.setOnAction(event ->
201-
{
202-
updating = true;
203-
new ChangeShowLegendCommand(model, undo, show_legend.isSelected());
204-
updating = false;
205-
});
206-
layout.add(show_legend, 3, 4);
207-
208-
setContent(layout);
209-
210-
model.addListener(model_listener);
211-
212-
// Initial values
213-
model_listener.changedTitle();
214-
model_listener.changedColorsOrFonts();
215-
model_listener.changedSaveChangesBehavior(model.shouldSaveChanges());
216-
model_listener.changedTiming();
217-
model_listener.changedLayout();
47+
try {
48+
setContent(loader.load());
49+
} catch (IOException e) {
50+
throw new RuntimeException(e);
51+
}
21852
}
21953
}

0 commit comments

Comments
 (0)