diff --git a/src/main/java/ctbrec/Model.java b/src/main/java/ctbrec/Model.java index dd6094a2..7850459d 100644 --- a/src/main/java/ctbrec/Model.java +++ b/src/main/java/ctbrec/Model.java @@ -11,6 +11,7 @@ public class Model { private List tags = new ArrayList<>(); private boolean online = false; private int streamUrlIndex = -1; + private int streamResolution = -1; public String getUrl() { return url; @@ -68,6 +69,14 @@ public class Model { this.streamUrlIndex = streamUrlIndex; } + public int getStreamResolution() { + return streamResolution; + } + + public void setStreamResolution(int streamResolution) { + this.streamResolution = streamResolution; + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/ctbrec/ui/ThumbCell.java b/src/main/java/ctbrec/ui/ThumbCell.java index cc16b33f..895dd680 100644 --- a/src/main/java/ctbrec/ui/ThumbCell.java +++ b/src/main/java/ctbrec/ui/ThumbCell.java @@ -45,6 +45,8 @@ import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import javafx.scene.input.Clipboard; +import javafx.scene.input.ClipboardContent; import javafx.scene.input.ContextMenuEvent; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; @@ -222,10 +224,12 @@ public class ThumbCell extends StackPane { LOG.trace("Resolution queue size: {}", ThumbOverviewTab.queue.size()); final int w = resolution[1]; Platform.runLater(() -> { - resolutionTag.setText(Integer.toString(w)); + String _res = Integer.toString(w); + resolutionTag.setText(_res); resolutionTag.setVisible(true); resolutionBackground.setVisible(true); resolutionBackground.setWidth(resolutionTag.getBoundsInLocal().getWidth() + 4); + model.setStreamResolution(w); }); } } catch (IOException | ParseException | PlaylistException | InterruptedException e) { @@ -236,8 +240,10 @@ public class ThumbCell extends StackPane { }); } else { ThumbOverviewTab.resolutionProcessing.remove(model); + String _res = Integer.toString(res[1]); + model.setStreamResolution(res[1]); Platform.runLater(() -> { - resolutionTag.setText(Integer.toString(res[1])); + resolutionTag.setText(_res); resolutionTag.setVisible(true); resolutionBackground.setVisible(true); resolutionBackground.setWidth(resolutionTag.getBoundsInLocal().getWidth() + 4); @@ -246,7 +252,7 @@ public class ThumbCell extends StackPane { } private void setImage(String url) { - if(!Objects.equals(System.getenv("CTBREC_THUMBS"), "0")) { + if(!Objects.equals(System.getenv("CTBREC_DEV"), "1")) { Image img = new Image(url, true); // wait for the image to load, otherwise the ImageView replaces the current image with an "empty" image, @@ -277,12 +283,20 @@ public class ThumbCell extends StackPane { MenuItem unfollow = new MenuItem("Unfollow"); unfollow.setOnAction((e) -> follow(false)); + MenuItem copyUrl = new MenuItem("Copy URL"); + copyUrl.setOnAction((e) -> { + final Clipboard clipboard = Clipboard.getSystemClipboard(); + final ClipboardContent content = new ClipboardContent(); + content.putString(model.getUrl()); + clipboard.setContent(content); + }); + ContextMenu contextMenu = new ContextMenu(); contextMenu.setAutoHide(true); contextMenu.setHideOnEscape(true); contextMenu.setAutoFix(true); MenuItem followOrUnFollow = parent instanceof FollowedTab ? unfollow : follow; - contextMenu.getItems().addAll(openInPlayer, startStop , followOrUnFollow); + contextMenu.getItems().addAll(openInPlayer, startStop , followOrUnFollow, copyUrl); return contextMenu; } diff --git a/src/main/java/ctbrec/ui/ThumbOverviewTab.java b/src/main/java/ctbrec/ui/ThumbOverviewTab.java index 9d8f33eb..aeefc90b 100644 --- a/src/main/java/ctbrec/ui/ThumbOverviewTab.java +++ b/src/main/java/ctbrec/ui/ThumbOverviewTab.java @@ -85,7 +85,12 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { search.setPromptText("Filter"); search.textProperty().addListener( (observableValue, oldValue, newValue) -> { filter = search.getText(); - filter(); + gridLock.lock(); + try { + filter(); + } finally { + gridLock.unlock(); + } }); BorderPane.setMargin(search, new Insets(5)); @@ -238,38 +243,32 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { } }); - - gridLock.lock(); - try { - if (filter == null || filter.isEmpty()) { - for (ThumbCell thumbCell : filteredThumbCells) { - insert(thumbCell); - } - return; + if (filter == null || filter.isEmpty()) { + for (ThumbCell thumbCell : filteredThumbCells) { + insert(thumbCell); } + return; + } - // remove the ones from grid, which don't match - for (Iterator iterator = grid.getChildren().iterator(); iterator.hasNext();) { - Node node = iterator.next(); - ThumbCell cell = (ThumbCell) node; - Model m = cell.getModel(); - if(!matches(m, filter)) { - iterator.remove(); - filteredThumbCells.add(cell); - } + // remove the ones from grid, which don't match + for (Iterator iterator = grid.getChildren().iterator(); iterator.hasNext();) { + Node node = iterator.next(); + ThumbCell cell = (ThumbCell) node; + Model m = cell.getModel(); + if(!matches(m, filter)) { + iterator.remove(); + filteredThumbCells.add(cell); } + } - // add the ones, which might have been filtered before, but now match - for (Iterator iterator = filteredThumbCells.iterator(); iterator.hasNext();) { - ThumbCell thumbCell = iterator.next(); - Model m = thumbCell.getModel(); - if(matches(m, filter)) { - iterator.remove(); - insert(thumbCell); - } + // add the ones, which might have been filtered before, but now match + for (Iterator iterator = filteredThumbCells.iterator(); iterator.hasNext();) { + ThumbCell thumbCell = iterator.next(); + Model m = thumbCell.getModel(); + if(matches(m, filter)) { + iterator.remove(); + insert(thumbCell); } - } finally { - gridLock.unlock(); } } @@ -305,7 +304,9 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { for (String tag : m.getTags()) { searchTextBuilder.append(tag).append(' '); } + searchTextBuilder.append(m.getStreamResolution()); String searchText = searchTextBuilder.toString().trim(); + LOG.debug("{} -> {}", m.getName(), searchText); boolean tokensMissing = false; for (String token : tokens) { if(!searchText.contains(token)) {