mirror of
https://gitlab.com/biskuteri-cafe/JKomasto2.git
synced 2025-01-08 21:24:45 +01:00
Fixed aliased image rendering in window components.
Added icons to notifications.
This commit is contained in:
parent
e6fea4c061
commit
d52879324f
@ -13,11 +13,14 @@ import java.awt.Color;
|
|||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.GridLayout;
|
import java.awt.GridLayout;
|
||||||
import java.awt.BorderLayout;
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.awt.Graphics;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.Cursor;
|
import java.awt.Cursor;
|
||||||
|
import java.awt.Insets;
|
||||||
import cafe.biskuteri.hinoki.Tree;
|
import cafe.biskuteri.hinoki.Tree;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.awt.event.ComponentListener;
|
import java.awt.event.ComponentListener;
|
||||||
@ -309,13 +312,20 @@ implements ComponentListener {
|
|||||||
private JLabel
|
private JLabel
|
||||||
type;
|
type;
|
||||||
|
|
||||||
|
private ImageComponent
|
||||||
|
typeImg;
|
||||||
|
|
||||||
private JLabel
|
private JLabel
|
||||||
name, text;
|
name, text;
|
||||||
|
|
||||||
// ---%-@-%---
|
// ---%-@-%---
|
||||||
|
|
||||||
public void
|
public void
|
||||||
setType(String n) { type.setText(n); }
|
setType(String n)
|
||||||
|
{
|
||||||
|
type.setText(n);
|
||||||
|
typeImg.image = ImageApi.local(n + "Notification");
|
||||||
|
}
|
||||||
|
|
||||||
public void
|
public void
|
||||||
setName(String n) { name.setText(n); }
|
setName(String n) { name.setText(n); }
|
||||||
@ -326,18 +336,32 @@ implements ComponentListener {
|
|||||||
// - -%- -
|
// - -%- -
|
||||||
|
|
||||||
public void
|
public void
|
||||||
componentResized(ComponentEvent eC)
|
doLayout()
|
||||||
{
|
{
|
||||||
int w = getWidth(), h = getHeight();
|
int w = getWidth(), h = getHeight();
|
||||||
name.setPreferredSize(new Dimension(w * 7 / 20, h));
|
|
||||||
type.setPreferredSize(new Dimension(w * 6 / 20, h));
|
int x0 = w * 0/20;
|
||||||
text.setPreferredSize(new Dimension(w * 5 / 20, h));
|
int x1 = w * 7/20;
|
||||||
|
int x2 = w * 13/20;
|
||||||
|
int x3 = w * 15/20;
|
||||||
|
int x4 = w * 20/20;
|
||||||
|
|
||||||
name.setMaximumSize(new Dimension(w * 7 / 20, h));
|
name.setLocation(x0 + 4, 0);
|
||||||
type.setMaximumSize(new Dimension(w * 6 / 20, h));
|
name.setSize((x1 - 4) - (x0 + 4), h);
|
||||||
text.setMaximumSize(new Dimension(w * 5 / 20, h));
|
|
||||||
|
type.setLocation(x1 + 4, 0);
|
||||||
|
type.setSize((x2 - 1) - (x1 + 4), h);
|
||||||
|
|
||||||
|
typeImg.setLocation((x2 + 1), 2);
|
||||||
|
typeImg.setSize((x3 - 4) - (x2 + 1), (h - 2) - 2);
|
||||||
|
|
||||||
|
text.setLocation(x3 + 4, 0);
|
||||||
|
text.setSize((x4 - 4) - (x3 + 4), h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void
|
||||||
|
componentResized(ComponentEvent eC) { doLayout(); }
|
||||||
|
|
||||||
public void
|
public void
|
||||||
componentShown(ComponentEvent eC) { }
|
componentShown(ComponentEvent eC) { }
|
||||||
|
|
||||||
@ -347,6 +371,51 @@ implements ComponentListener {
|
|||||||
public void
|
public void
|
||||||
componentMoved(ComponentEvent eC) { }
|
componentMoved(ComponentEvent eC) { }
|
||||||
|
|
||||||
|
// ---%-@-%---
|
||||||
|
|
||||||
|
private static class
|
||||||
|
ImageComponent extends JComponent {
|
||||||
|
|
||||||
|
private Image
|
||||||
|
image,
|
||||||
|
scaled;
|
||||||
|
|
||||||
|
private boolean
|
||||||
|
snapdown = false;
|
||||||
|
|
||||||
|
// -=%=-
|
||||||
|
|
||||||
|
protected void
|
||||||
|
paintComponent(Graphics g)
|
||||||
|
{
|
||||||
|
if (image == null) return;
|
||||||
|
int w = getWidth(), h = getHeight();
|
||||||
|
|
||||||
|
int ow = image.getWidth(this);
|
||||||
|
int oh = image.getHeight(this);
|
||||||
|
int nh = h;
|
||||||
|
int nw = ow * nh/oh;
|
||||||
|
if (snapdown)
|
||||||
|
{
|
||||||
|
int sw, sh;
|
||||||
|
for (sw = 1; sw < nw; sw *= 2);
|
||||||
|
for (sh = 1; sh < nh; sh *= 2);
|
||||||
|
nw = sw / 2;
|
||||||
|
nh = sh / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scaled == null)
|
||||||
|
scaled = image.getScaledInstance(
|
||||||
|
nw, nh,
|
||||||
|
Image.SCALE_SMOOTH
|
||||||
|
);
|
||||||
|
int x = (w - nw) / 2;
|
||||||
|
int y = (h - nh) / 2;
|
||||||
|
g.drawImage(scaled, x, y, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// ---%-@-%---
|
// ---%-@-%---
|
||||||
|
|
||||||
NotificationComponent()
|
NotificationComponent()
|
||||||
@ -360,22 +429,23 @@ implements ComponentListener {
|
|||||||
Border b1 = BorderFactory.createMatteBorder(0, 0, 1, 0, c);
|
Border b1 = BorderFactory.createMatteBorder(0, 0, 1, 0, c);
|
||||||
|
|
||||||
name = new JLabel();
|
name = new JLabel();
|
||||||
type = new JLabel();
|
|
||||||
text = new JLabel();
|
|
||||||
name.setFont(f1);
|
name.setFont(f1);
|
||||||
|
|
||||||
|
type = new JLabel();
|
||||||
type.setFont(f2);
|
type.setFont(f2);
|
||||||
text.setFont(f3);
|
|
||||||
type.setHorizontalAlignment(JLabel.RIGHT);
|
type.setHorizontalAlignment(JLabel.RIGHT);
|
||||||
|
|
||||||
|
typeImg = new ImageComponent();
|
||||||
|
|
||||||
|
text = new JLabel();
|
||||||
|
text.setFont(f3);
|
||||||
|
|
||||||
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
|
setLayout(null);
|
||||||
add(Box.createHorizontalStrut(4));
|
|
||||||
add(name);
|
add(name);
|
||||||
add(Box.createHorizontalStrut(8));
|
|
||||||
add(type);
|
add(type);
|
||||||
add(Box.createHorizontalStrut(8));
|
add(typeImg);
|
||||||
add(text);
|
add(text);
|
||||||
add(Box.createHorizontalStrut(4));
|
|
||||||
|
|
||||||
this.addComponentListener(this);
|
this.addComponentListener(this);
|
||||||
setBorder(b1);
|
setBorder(b1);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import java.awt.Image;
|
|||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Shape;
|
import java.awt.Shape;
|
||||||
|
import java.awt.Rectangle;
|
||||||
import java.awt.geom.Ellipse2D;
|
import java.awt.geom.Ellipse2D;
|
||||||
import java.awt.event.MouseListener;
|
import java.awt.event.MouseListener;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
@ -253,6 +254,9 @@ implements KeyListener, MouseListener, FocusListener {
|
|||||||
|
|
||||||
// - -%- -
|
// - -%- -
|
||||||
|
|
||||||
|
private Image
|
||||||
|
scaled;
|
||||||
|
|
||||||
private int
|
private int
|
||||||
nextEventID = ActionEvent.ACTION_FIRST;
|
nextEventID = ActionEvent.ACTION_FIRST;
|
||||||
|
|
||||||
@ -266,10 +270,21 @@ implements KeyListener, MouseListener, FocusListener {
|
|||||||
// ---%-@-%---
|
// ---%-@-%---
|
||||||
|
|
||||||
public void
|
public void
|
||||||
setImage(Image n) { image = n; }
|
setImage(Image n)
|
||||||
|
{
|
||||||
|
image = n;
|
||||||
|
scaled = null;
|
||||||
|
}
|
||||||
|
|
||||||
// - -%- -
|
// - -%- -
|
||||||
|
|
||||||
|
public boolean
|
||||||
|
imageUpdate(Image i, int f, int x, int y, int w, int h)
|
||||||
|
{
|
||||||
|
if ((f | WIDTH) != 0) repaint();
|
||||||
|
return super.imageUpdate(i, f, x, y, w, h);
|
||||||
|
}
|
||||||
|
|
||||||
protected void
|
protected void
|
||||||
paintComponent(Graphics g)
|
paintComponent(Graphics g)
|
||||||
{
|
{
|
||||||
@ -281,26 +296,32 @@ implements KeyListener, MouseListener, FocusListener {
|
|||||||
|
|
||||||
if (image == null) return;
|
if (image == null) return;
|
||||||
|
|
||||||
int w1 = button.getWidth(this);
|
int ow = image.getWidth(this);
|
||||||
int h1 = button.getHeight(this);
|
int oh = image.getHeight(this);
|
||||||
int w2 = image.getWidth(this);
|
if (ow == -1) return;
|
||||||
int h2 = image.getHeight(this);
|
|
||||||
if (w2 == -1) w2 = w1;
|
int nx = 6;
|
||||||
if (h2 == -1) h2 = h1;
|
int ny = 6;
|
||||||
if (h2 > w2) {
|
int nw = button.getWidth(this) - 12;
|
||||||
h2 = h2 * w1 / w2;
|
int nh = button.getHeight(this) - 12;
|
||||||
w2 = w1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
w2 = w2 * h1 / h2;
|
|
||||||
h2 = h1;
|
|
||||||
}
|
|
||||||
Shape defaultClip, roundClip;
|
Shape defaultClip, roundClip;
|
||||||
defaultClip = g.getClip();
|
defaultClip = g.getClip();
|
||||||
roundClip = new Ellipse2D.Float(6, 6, w1 - 12, h1 - 12);
|
roundClip = new Ellipse2D.Float(nx, ny, nw, nh);
|
||||||
|
|
||||||
|
if (scaled == null)
|
||||||
|
{
|
||||||
|
int sw = ow > oh ? -1 : nw;
|
||||||
|
int sh = oh > ow ? -1 : nh;
|
||||||
|
scaled = image.getScaledInstance(
|
||||||
|
sw, sh,
|
||||||
|
Image.SCALE_SMOOTH
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// (知) Be careful to be idempotent when calling
|
||||||
|
// async methods like #drawImage.
|
||||||
|
|
||||||
g.setClip(roundClip);
|
g.setClip(roundClip);
|
||||||
g.drawImage(image, 0, 0, w2, h2, getParent());
|
g.drawImage(scaled, nx, ny, getParent());
|
||||||
// I don't know why, but when we repaint ourselves, our
|
// I don't know why, but when we repaint ourselves, our
|
||||||
// parent doesn't repaint, so nothing seems to happen.
|
// parent doesn't repaint, so nothing seems to happen.
|
||||||
g.setClip(defaultClip);
|
g.setClip(defaultClip);
|
||||||
|
BIN
graphics/boostedNotification.png
Normal file
BIN
graphics/boostedNotification.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 389 B |
BIN
graphics/favouritedNotification.png
Executable file
BIN
graphics/favouritedNotification.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
Loading…
Reference in New Issue
Block a user