Skip to content

Commit

Permalink
- implement a javafx dark mode for filter dialog
Browse files Browse the repository at this point in the history
- remove fxml use from CommonViewSettingsPane
  • Loading branch information
derreisende77 committed Aug 25, 2024
1 parent 604eff4 commit 413dd25
Show file tree
Hide file tree
Showing 5 changed files with 881 additions and 164 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
- **FEATURE(Linux/Windows):** Das Aussehen von FlatLaf kann in `.mediathek3/flatlaf` angepasst werden.
- **FEATURE:** Selektierte Einträge in `Suchhistorie bearbeiten`-Dialog können nun mittels Entfernen-Taste gelöscht werden.
- **FEATURE:** Das Blacklist Filter-Icon in der Toolbar kann mittels *Einstellungen/Allgemein* mit einem aussagefähigen Zusatztext dargestellt werden.
- **FEATURE:** Dark Mode für Filter-Dialog.

# **14.1.0**
- JDK 21 wird nun mitgeliefert. Behebt primär Darstellungsfehler von Java Apps unter Windows.
Expand Down
198 changes: 124 additions & 74 deletions src/main/java/mediathek/javafx/filterpanel/CommonViewSettingsPane.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,83 +5,143 @@
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.scene.layout.*;
import javafx.util.StringConverter;
import mediathek.gui.messages.TableModelChangeEvent;
import mediathek.tool.FilterDTO;
import mediathek.tool.MessageBus;
import net.engio.mbassy.listener.Handler;
import org.apache.commons.lang3.SystemUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class CommonViewSettingsPane extends VBox implements Initializable {
private static final Logger logger = LogManager.getLogger(CommonViewSettingsPane.class);
@FXML
public Button btnDeleteFilterSettings;
@FXML
public CheckBox cbShowOnlyHd;
@FXML
public CheckBox cbShowSubtitlesOnly;
@FXML
public CheckBox cbShowNewOnly;
@FXML
public CheckBox cbShowBookMarkedOnly;
@FXML
public CheckBox cbShowOnlyLivestreams;
@FXML
public CheckBox cbShowUnseenOnly;
@FXML
public CheckBox cbDontShowAbos;
@FXML
public CheckBox cbDontShowGebaerdensprache;
@FXML
public CheckBox cbDontShowTrailers;
@FXML
public CheckBox cbDontShowAudioVersions;
@FXML
public SenderBoxNode senderCheckList;
@FXML
public ThemaComboBox themaComboBox;
@FXML
public FilmLenghtSliderNode filmLengthSliderNode;
@FXML
public ZeitraumSpinner zeitraumSpinner;
@FXML
public Button btnDeleteCurrentFilter;
@FXML
private Label themaLabel;
@FXML
private ComboBox<FilterDTO> filterSelect;
@FXML
private Button btnAddNewFilter;
@FXML
public Button btnRenameFilter;
import org.controlsfx.glyphfont.Glyph;

public class CommonViewSettingsPane extends VBox {
public final ThemaComboBox themaComboBox = new ThemaComboBox();
public final FilmLenghtSliderNode filmLengthSliderNode = new FilmLenghtSliderNode();
public final ZeitraumSpinner zeitraumSpinner = new ZeitraumSpinner();
public final SenderBoxNode senderCheckList = new SenderBoxNode();
public final CheckBox cbDontShowAudioVersions = new CheckBox("Hörfassungen ausblenden");
public final CheckBox cbDontShowGebaerdensprache = new CheckBox("Gebärdensprache nicht anzeigen");
public final CheckBox cbDontShowTrailers = new CheckBox("Trailer/Teaser/Vorschau nicht anzeigen");
public final CheckBox cbShowUnseenOnly = new CheckBox("Gesehene Filme nicht anzeigen");
public final CheckBox cbDontShowAbos = new CheckBox("Abos nicht anzeigen");
public final CheckBox cbShowOnlyHd = new CheckBox("Nur High Quality(HQ) Filme anzeigen");
public final CheckBox cbShowSubtitlesOnly = new CheckBox("Nur Filme mit Untertitel anzeigen");
public final CheckBox cbShowNewOnly = new CheckBox("Nur neue Filme anzeigen");
public final CheckBox cbShowBookMarkedOnly = new CheckBox("Nur gemerkte Filme anzeigen");
public final CheckBox cbShowOnlyLivestreams = new CheckBox("Nur Livestream anzeigen");
public final Button btnDeleteFilterSettings = new Button();
public final Button btnDeleteCurrentFilter = new Button();
public final Button btnRenameFilter = new Button();
private final ComboBox<FilterDTO> filterSelect = new ComboBox<>();
private final Button btnAddNewFilter = new Button();
private boolean deleteCurrentFilterButtonDisabled;

public CommonViewSettingsPane() {
super();

try {
URL url = getClass().getResource("/mediathek/res/programm/fxml/filter_settings_pane.fxml");
FXMLLoader fxmlLoader = new FXMLLoader(url);
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();
} catch (IOException e) {
logger.error("Failed to load FXML!", e);
static class FontAwesomeGlyph extends Glyph {
public FontAwesomeGlyph(String icon) {
setFontFamily("FontAwesome");
setFontSize(16d);
setIcon(icon);
}
}

private HBox createTopButtonRow() {
HBox btnBox = new HBox();
btnBox.setSpacing(4d);
btnBox.getChildren().addAll(filterSelect, btnRenameFilter, btnAddNewFilter, btnDeleteCurrentFilter,
new Separator(Orientation.VERTICAL), btnDeleteFilterSettings);
return btnBox;
}

private Pane createSenderList() {
senderCheckList.setPrefHeight(150d);
senderCheckList.setMinHeight(100d);
VBox.setVgrow(senderCheckList, Priority.ALWAYS);
var titledPane = new VBox();
titledPane.getChildren().addAll(new Label("Sender:"),
senderCheckList);
VBox.setVgrow(titledPane, Priority.ALWAYS);

return titledPane;
}

private Pane createThemaBox() {
var hbox = new HBox();
hbox.setSpacing(4d);
HBox.setHgrow(themaComboBox, Priority.ALWAYS);
var borderPane = new BorderPane();
var themaLabel = new Label("Thema:");
themaLabel.setMinWidth(USE_PREF_SIZE);
// font size is greater on tested ubuntu linux :(
if (SystemUtils.IS_OS_LINUX)
themaLabel.setPrefWidth(50d);
else
themaLabel.setPrefWidth(45d);
borderPane.setCenter(themaLabel);
hbox.getChildren().addAll(borderPane, themaComboBox);

return hbox;
}

private void setupButtons() {
btnRenameFilter.setTooltip(new Tooltip("Filter umbenennen"));
btnRenameFilter.setGraphic(new FontAwesomeGlyph("EDIT"));

btnAddNewFilter.setTooltip(new Tooltip("Neuen Filter anlegen"));
btnAddNewFilter.setGraphic(new FontAwesomeGlyph("PLUS"));

btnDeleteCurrentFilter.setTooltip(new Tooltip("Aktuellen Filter löschen"));
btnDeleteCurrentFilter.setGraphic(new FontAwesomeGlyph("TRASH_ALT"));

btnDeleteFilterSettings.setTooltip(new Tooltip("Aktuellen Filter zurücksetzen"));
btnDeleteFilterSettings.setGraphic(new FontAwesomeGlyph("RECYCLE"));
}

public CommonViewSettingsPane() {
setPadding(new Insets(5, 5, 5, 5));
setSpacing(4d);

filterSelect.setPromptText("Filter Auswahl");

setupButtons();

getChildren().addAll(createTopButtonRow(),
new Separator(),
cbShowNewOnly,
cbShowBookMarkedOnly,
cbShowOnlyHd,
cbShowSubtitlesOnly,
cbShowOnlyLivestreams,
new Separator(),
cbShowUnseenOnly,
cbDontShowAbos,
cbDontShowGebaerdensprache,
cbDontShowTrailers,
cbDontShowAudioVersions,
new Separator(),
createSenderList(),
new Separator(),
createThemaBox(),
new Separator(),
filmLengthSliderNode,
new Separator(),
createZeitraumSpinner());


MessageBus.getMessageBus().subscribe(this);
}

private Pane createZeitraumSpinner() {
var flowPane = new FlowPane(4d,0d);
flowPane.getChildren().add(new Label("Zeitraum:"));
flowPane.getChildren().add(zeitraumSpinner);
flowPane.getChildren().add(new Label("Tage"));

return flowPane;
}

/**
* Prevent user from changing filter settings while the swing table model gets updated.
*
Expand Down Expand Up @@ -119,16 +179,6 @@ public void disableDeleteCurrentFilterButton(boolean disable) {
btnDeleteCurrentFilter.setDisable(disable);
}

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
themaLabel.setMinWidth(USE_PREF_SIZE);
// font size is greater on tested ubuntu linux :(
if (SystemUtils.IS_OS_LINUX) themaLabel.setPrefWidth(50d);
else themaLabel.setPrefWidth(45d);

MessageBus.getMessageBus().subscribe(this);
}

public void setFilterSelectionChangeListener(ChangeListener<FilterDTO> changeListener) {
filterSelect.getSelectionModel().selectedItemProperty().addListener(changeListener);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package mediathek.javafx.filterpanel;

import com.formdev.flatlaf.FlatLaf;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import mediathek.config.Daten;
import mediathek.filmeSuchen.ListenerFilmeLaden;
import mediathek.filmeSuchen.ListenerFilmeLadenEvent;
import mediathek.gui.messages.DarkModeChangeEvent;
import mediathek.gui.messages.TableModelChangeEvent;
import mediathek.tool.ApplicationConfiguration;
import mediathek.tool.MessageBus;
Expand All @@ -23,6 +25,7 @@
public class OldSwingJavaFxFilterDialog extends JDialog {
private final JFXPanel fxPanel = new JFXPanel();
private final JToggleButton filterToggleButton;
private Scene scene;

public OldSwingJavaFxFilterDialog(Frame owner, CommonViewSettingsPane content, @NotNull JToggleButton filterToggleButton) {
super(owner);
Expand All @@ -36,7 +39,9 @@ public OldSwingJavaFxFilterDialog(Frame owner, CommonViewSettingsPane content, @
setType(Type.UTILITY);
setContentPane(fxPanel);
Platform.runLater(() -> {
fxPanel.setScene(new Scene(content));
scene = new Scene(content);
setupJavaFxDarkMode();
fxPanel.setScene(scene);
SwingUtilities.invokeLater(() -> {
pack();
restoreWindowSizeFromConfig();
Expand Down Expand Up @@ -64,6 +69,21 @@ public void fertig(ListenerFilmeLadenEvent event) {
});
}

private void setupJavaFxDarkMode() {
if (FlatLaf.isLafDark()) {
var res = getClass().getResource("/mediathek/res/css/javafx-dark-mode/style.css");
assert res != null;
scene.getStylesheets().add(res.toExternalForm());
}
else
scene.getStylesheets().clear();
}

@Handler
private void handleDarkModeChange(DarkModeChangeEvent e) {
Platform.runLater(this::setupJavaFxDarkMode);
}

@Handler
private void handleTableModelChangeEvent(TableModelChangeEvent e) {
SwingUtilities.invokeLater(() -> setEnabled(!e.active));
Expand Down
Loading

0 comments on commit 413dd25

Please sign in to comment.