55import com .thecoderscorner .menu .domain .util .PortablePalette ;
66import javafx .collections .FXCollections ;
77import javafx .scene .control .*;
8- import javafx .scene .image .Image ;
9- import javafx .scene .image .ImageView ;
8+ import javafx .scene .image .*;
109import javafx .scene .layout .ColumnConstraints ;
1110import javafx .scene .layout .GridPane ;
1211import javafx .scene .layout .Priority ;
1312import javafx .scene .layout .RowConstraints ;
1413import javafx .stage .Popup ;
1514import javafx .stage .Stage ;
1615
16+ import java .util .Arrays ;
1717import java .util .function .Consumer ;
1818
1919public class BitmapImportPopup {
2020 public static final PortablePalette EMPTY_PALETTE = new PortablePalette (
2121 new PortableColor [] { PortableColor .BLACK , PortableColor .WHITE }, PortablePalette .PaletteMode .ONE_BPP
2222 );
23- private final Image loadedImage ;
23+ private Image loadedImage ;
2424 private PortablePalette palette = EMPTY_PALETTE ;
2525 private int tolerance ;
2626 private boolean applyAlpha ;
@@ -30,6 +30,10 @@ public BitmapImportPopup(Image loadedImage) {
3030 this .loadedImage = loadedImage ;
3131 }
3232
33+ public BitmapImportPopup () {
34+ this .loadedImage = null ;
35+ }
36+
3337 private RowConstraints priorityRowConstraint (Priority priority ) {
3438 var c = new RowConstraints ();
3539 c .setVgrow (priority );
@@ -42,6 +46,59 @@ private ColumnConstraints priorityColConstraint(Priority priority) {
4246 return c ;
4347 }
4448
49+ public void showNewBitmap (Stage where , Consumer <BitmapImportPopup > importContinuation ) {
50+ var popup = new Popup ();
51+ var grid = new GridPane ();
52+ grid .setVgap (4 );
53+ grid .setHgap (4 );
54+ grid .getColumnConstraints ().add (priorityColConstraint (Priority .NEVER ));
55+ grid .getColumnConstraints ().add (priorityColConstraint (Priority .SOMETIMES ));
56+ for (int i =0 ; i <10 ; i ++) {
57+ grid .getRowConstraints ().add (priorityRowConstraint (Priority .NEVER ));
58+ }
59+
60+ int row = 0 ;
61+
62+ grid .add (new Label ("Width Pixels" ), 0 , row );
63+ Spinner <Integer > widthSpinner = new Spinner <>(1 , 256 , 32 );
64+ grid .add (widthSpinner , 1 , row ++);
65+ grid .add (new Label ("Height Pixels" ), 0 , row );
66+ Spinner <Integer > heightSpinner = new Spinner <>(1 , 256 , 32 );
67+ grid .add (heightSpinner , 1 , row ++);
68+
69+ grid .add (new Label ("Palette Mode" ), 0 , row );
70+ var pixelFormatCombo = new ComboBox <NativePixelFormat >();
71+ pixelFormatCombo .setItems (FXCollections .observableArrayList (NativePixelFormat .values ()));
72+ pixelFormatCombo .getSelectionModel ().select (0 );
73+ grid .add (pixelFormatCombo , 1 , row ++);
74+
75+ Button createButton = createButtonBar ("Create" , grid , row , popup );
76+
77+ createButton .setOnAction (event -> {
78+ tolerance = 0 ;
79+ applyAlpha = false ;
80+ pixelFormat = pixelFormatCombo .getValue ();
81+ palette = new UIColorPaletteControl ().createPaletteFor (pixelFormatCombo .getValue ());
82+ loadedImage = generateImage (widthSpinner .getValue (), heightSpinner .getValue (), palette .getColorAt (0 ));
83+ importContinuation .accept (this );
84+ popup .hide ();
85+ });
86+
87+ popup .getContent ().add (grid );
88+ popup .show (where );
89+ }
90+
91+ private Image generateImage (Integer width , Integer height , PortableColor color ) {
92+ WritableImage img = new WritableImage (width , height );
93+ PixelWriter pw = img .getPixelWriter ();
94+
95+ int [] pixels = new int [width * height ];
96+ Arrays .fill (pixels , color .asArgb ());
97+
98+ pw .setPixels (0 , 0 , width , height , PixelFormat .getIntArgbInstance (), pixels , 0 , width );
99+ return img ;
100+ }
101+
45102 public void showConfigSetup (Stage where , Consumer <BitmapImportPopup > importContinuation ) {
46103 var popup = new Popup ();
47104 var grid = new GridPane ();
@@ -56,8 +113,9 @@ public void showConfigSetup(Stage where, Consumer<BitmapImportPopup> importConti
56113 int row = 0 ;
57114 UIColorPaletteControl paletteControl = new UIColorPaletteControl ();
58115 grid .add (new Label ("Settings for Image Import" ), 0 , row ++);
59- grid .add (new ImageView (loadedImage ), 0 , row , 1 , 8 );
60-
116+ if (loadedImage != null ) {
117+ grid .add (new ImageView (loadedImage ), 0 , row , 1 , 8 );
118+ }
61119 grid .add (new Label ("Output Format" ), 1 , row ++);
62120 var pixelFormatCombo = new ComboBox <NativePixelFormat >();
63121 pixelFormatCombo .setItems (FXCollections .observableArrayList (NativePixelFormat .values ()));
@@ -89,15 +147,7 @@ public void showConfigSetup(Stage where, Consumer<BitmapImportPopup> importConti
89147 paletteControl .initializePaletteEntries (palette , 350 );
90148 grid .add (paletteControl .getControl (), 1 , row ++);
91149
92- ButtonBar buttonBar = new ButtonBar ();
93- Button importButton = new Button ("Import" );
94- importButton .setDefaultButton (true );
95- buttonBar .getButtons ().add (importButton );
96- Button cancelButton = new Button ("Cancel" );
97- cancelButton .setCancelButton (true );
98- buttonBar .getButtons ().add (cancelButton );
99- grid .add (buttonBar , 0 , row , 2 , 1 );
100- grid .setStyle ("-fx-background-color: #1f1a1a;-fx-border-style: solid;-fx-border-color: black;-fx-border-width: 2;-fx-background-insets: 6;-fx-padding: 10;-fx-font-size: " + GlobalSettings .defaultFontSize ());
150+ Button importButton = createButtonBar ("Import" , grid , row , popup );
101151
102152 popup .getContent ().add (grid );
103153 popup .show (where );
@@ -110,7 +160,20 @@ public void showConfigSetup(Stage where, Consumer<BitmapImportPopup> importConti
110160 popup .hide ();
111161 });
112162
163+ }
164+
165+ private static Button createButtonBar (String actionTxt , GridPane grid , int row , Popup popup ) {
166+ ButtonBar buttonBar = new ButtonBar ();
167+ Button importButton = new Button (actionTxt );
168+ importButton .setDefaultButton (true );
169+ buttonBar .getButtons ().add (importButton );
170+ Button cancelButton = new Button ("Cancel" );
171+ cancelButton .setCancelButton (true );
172+ buttonBar .getButtons ().add (cancelButton );
173+ grid .add (buttonBar , 0 , row , 2 , 1 );
174+ grid .setStyle ("-fx-background-color: #1f1a1a;-fx-border-style: solid;-fx-border-color: black;-fx-border-width: 2;-fx-background-insets: 6;-fx-padding: 10;-fx-font-size: " + GlobalSettings .defaultFontSize ());
113175 cancelButton .setOnAction (event -> popup .hide ());
176+ return importButton ;
114177 }
115178
116179 public Image getImage () {
0 commit comments