Added actual document icons.

This commit is contained in:
Andrew Lalis 2023-12-30 19:09:06 -05:00
parent c08276abbf
commit aa90f98424
6 changed files with 126 additions and 29 deletions

69
design/doc-icon.svg Normal file
View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="64"
height="64"
viewBox="0 0 16.933333 16.933333"
version="1.1"
id="svg1"
inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)"
sodipodi:docname="doc-icon.svg"
inkscape:export-filename="../src/main/resources/images/doc-icon.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
inkscape:document-units="px"
inkscape:zoom="8.3452885"
inkscape:cx="18.273784"
inkscape:cy="26.601836"
inkscape:window-width="1920"
inkscape:window-height="1025"
inkscape:window-x="1080"
inkscape:window-y="470"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="rect1"
style="fill:#d2d2d2;fill-opacity:1;stroke:#000031;stroke-width:0.880783;stroke-opacity:1"
d="m 3.0114942,0.69473565 h 8.8346808 c 0.650605,0 3.250041,2.33700955 3.250041,2.98761475 V 15.06422 c 0,0.650604 -0.523773,1.174377 -1.174377,1.174377 H 3.0114942 c -0.6506051,0 -1.1743773,-0.523773 -1.1743773,-1.174377 V 1.869113 c 0,-0.6506052 0.5237722,-1.17437735 1.1743773,-1.17437735 z"
sodipodi:nodetypes="sssssssss" />
<path
style="fill:none;stroke:#000031;stroke-width:0.880783;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 11.846175,0.69473565 c 0,0 -0.308342,1.92253135 0.378055,2.60892725 0.763774,0.7637736 2.871986,0.3786875 2.871986,0.3786875"
id="path1"
sodipodi:nodetypes="csc" />
<path
style="fill:none;stroke:#000031;stroke-width:0.880783;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 3.8656138,3.0179173 H 10.014863"
id="path2" />
<path
style="fill:none;stroke:#000031;stroke-width:0.880783;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 3.8656138,5.3359736 H 11.205695"
id="path3"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000031;stroke-width:0.880783;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 3.8656138,7.6540298 H 13.100137"
id="path4"
sodipodi:nodetypes="cc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -4,6 +4,9 @@ import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType; import javafx.scene.control.ButtonType;
import javafx.stage.Modality; import javafx.stage.Modality;
/**
* Helper class for standardized popups and confirmation dialogs for the app.
*/
public class Popups { public class Popups {
public static boolean confirm(String text) { public static boolean confirm(String text) {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION, text); Alert alert = new Alert(Alert.AlertType.CONFIRMATION, text);

View File

@ -70,6 +70,12 @@ public class TransactionsViewController implements RouteSelectionListener {
selectedTransaction.addListener((observable, oldValue, newValue) -> { selectedTransaction.addListener((observable, oldValue, newValue) -> {
transactionViewController.setTransaction(newValue); transactionViewController.setTransaction(newValue);
}); });
// Clear the transactions when a new profile is loaded.
Profile.whenLoaded(profile -> {
transactionsVBox.getChildren().clear();
onRouteSelected(null);
});
} }
@Override @Override

View File

@ -6,7 +6,6 @@ import javafx.scene.image.Image;
import javafx.scene.image.ImageView; import javafx.scene.image.ImageView;
import javafx.scene.layout.*; import javafx.scene.layout.*;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
@ -31,19 +30,25 @@ public class AttachmentPreview extends BorderPane {
nameContainer.setMinHeight(LABEL_SIZE); nameContainer.setMinHeight(LABEL_SIZE);
contentContainer.setBottom(nameContainer); contentContainer.setBottom(nameContainer);
Rectangle placeholder = new Rectangle(IMAGE_SIZE, IMAGE_SIZE); boolean showDocIcon = true;
placeholder.setFill(Color.WHITE);
contentContainer.setCenter(placeholder);
Set<String> imageTypes = Set.of("image/png", "image/jpeg", "image/gif", "image/bmp"); Set<String> imageTypes = Set.of("image/png", "image/jpeg", "image/gif", "image/bmp");
if (imageTypes.contains(attachment.getContentType())) { if (imageTypes.contains(attachment.getContentType())) {
try (var in = Files.newInputStream(attachment.getPath())) { try (var in = Files.newInputStream(attachment.getPath())) {
Image img = new Image(in, IMAGE_SIZE, IMAGE_SIZE, true, true); Image img = new Image(in, IMAGE_SIZE, IMAGE_SIZE, true, true);
contentContainer.setCenter(new ImageView(img)); contentContainer.setCenter(new ImageView(img));
showDocIcon = false;
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(System.err); e.printStackTrace(System.err);
} }
} }
if (showDocIcon) {
try (var in = AttachmentPreview.class.getResourceAsStream("/images/doc-icon.png")) {
Image img = new Image(in, IMAGE_SIZE, IMAGE_SIZE, true, true);
contentContainer.setCenter(new ImageView(img));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
BorderPane hoverIndicatorPane = new BorderPane(); BorderPane hoverIndicatorPane = new BorderPane();
hoverIndicatorPane.prefWidthProperty().bind(contentContainer.widthProperty()); hoverIndicatorPane.prefWidthProperty().bind(contentContainer.widthProperty());

View File

@ -3,6 +3,7 @@ package com.andrewlalis.perfin.view.component;
import com.andrewlalis.perfin.data.pagination.Page; import com.andrewlalis.perfin.data.pagination.Page;
import com.andrewlalis.perfin.data.pagination.PageRequest; import com.andrewlalis.perfin.data.pagination.PageRequest;
import com.andrewlalis.perfin.data.pagination.Sort; import com.andrewlalis.perfin.data.pagination.Sort;
import javafx.application.Platform;
import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanProperty;
import javafx.beans.property.IntegerProperty; import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleBooleanProperty;
@ -10,11 +11,13 @@ import javafx.beans.property.SimpleIntegerProperty;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener; import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane; import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.scene.text.Text; import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
import javafx.scene.text.TextFlow; import javafx.scene.text.TextFlow;
/** /**
@ -48,8 +51,12 @@ public class DataSourcePaginationControls extends BorderPane {
maxPagesLabel.textProperty().bind(maxPages.asString()); maxPagesLabel.textProperty().bind(maxPages.asString());
TextFlow maxPagesText = new TextFlow(new Text(" / "), maxPagesLabel); TextFlow maxPagesText = new TextFlow(new Text(" / "), maxPagesLabel);
maxPagesText.managedProperty().bind(maxPagesText.visibleProperty()); maxPagesText.managedProperty().bind(maxPagesText.visibleProperty());
maxPagesText.visibleProperty().bind(maxPages.isNotEqualTo(-1)); maxPagesText.visibleProperty().bind(maxPages.greaterThan(0));
TextFlow pageText = new TextFlow(new Text("Page "), currentPageLabel, maxPagesText); TextFlow pageText = new TextFlow(new Text("Page "), currentPageLabel, maxPagesText);
pageText.setTextAlignment(TextAlignment.CENTER);
BorderPane pageTextContainer = new BorderPane(pageText);
BorderPane.setAlignment(pageText, Pos.CENTER);
pageTextContainer.setStyle("-fx-border-color: blue;");
Button previousPageButton = new Button("Previous Page"); Button previousPageButton = new Button("Previous Page");
@ -59,24 +66,27 @@ public class DataSourcePaginationControls extends BorderPane {
nextPageButton.disableProperty().bind(fetching.or(currentPage.greaterThanOrEqualTo(maxPages))); nextPageButton.disableProperty().bind(fetching.or(currentPage.greaterThanOrEqualTo(maxPages)));
nextPageButton.setOnAction(event -> setPage(currentPage.get() + 1)); nextPageButton.setOnAction(event -> setPage(currentPage.get() + 1));
sorts.addListener((ListChangeListener<Sort>) c -> { // sorts.addListener((ListChangeListener<Sort>) c -> {
setPage(1); // setPage(1);
}); // });
HBox hbox = new HBox( HBox hbox = new HBox(
previousPageButton, previousPageButton,
pageText, pageTextContainer,
nextPageButton nextPageButton
); );
hbox.getStyleClass().addAll("std-padding", "std-spacing");
setCenter(hbox); setCenter(hbox);
} }
public void setPage(int page) { public void setPage(int page) {
try {
fetching.set(true); fetching.set(true);
PageRequest pagination = new PageRequest(page - 1, itemsPerPage.get(), sorts); PageRequest pagination = new PageRequest(page - 1, itemsPerPage.get(), sorts);
Thread.ofVirtual().start(() -> {
try {
var p = fetcher.fetchPage(pagination); var p = fetcher.fetchPage(pagination);
int totalResults = fetcher.getTotalCount(); int totalResults = fetcher.getTotalCount();
Platform.runLater(() -> {
target.setAll(p.items()); target.setAll(p.items());
if (totalResults != -1) { if (totalResults != -1) {
int max = totalResults / itemsPerPage.get(); int max = totalResults / itemsPerPage.get();
@ -86,11 +96,15 @@ public class DataSourcePaginationControls extends BorderPane {
maxPages.set(max); maxPages.set(max);
} }
currentPage.set(page); currentPage.set(page);
} catch (Exception e) {
target.clear();
e.printStackTrace(System.err);
} finally {
fetching.set(false); fetching.set(false);
} });
} catch (Exception e) {
e.printStackTrace(System.err);
Platform.runLater(() -> {
target.clear();
fetching.set(false);
});
}
});
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB