package haven; import java.awt.Color; import java.util.List; public class SessionBar extends WindowTrans { public final static int ID = 1000; public static Coord initPos = new Coord(340, 10); private final static Tex bg = Resource.loadtex("gfx/hud/bgtex"); private static final Coord unborder = new Coord(2, 2); private static final Coord dasz = new Coord(74, 74); private Color color = Color.WHITE; private static final Coord avasz = new Coord(40, 40); private static final int BORDER = 5; private static final int LEFT_OFFSET = 25; private static final Text.Foundry nfnd = new Text.Foundry("SansSerif", 10); static { Widget.addtype("sessionbar", new WidgetFactory() { public Widget create(Coord c, Widget parent, Object[] args) { return (new SessionBar(c, parent)); } }); } public SessionBar(Coord c, Widget parent) { super(c, new Coord(LEFT_OFFSET + avasz.x + 2 * BORDER, 25), parent, null); cbtn.visible = false; fbtn.c = new Coord(0, 1); fbtn.show(); mrgn = new Coord(0, 0); } public void draw(GOut g) { super.draw(g); if (folded) return; recalcsz(null); List<SessionData> sess = MaidFrame.getSessionList(); for (int i = 0; i < sess.size(); i++) drawAvatar(g, i, sess.get(i)); } private void drawAvatar(GOut g, int index, SessionData sess) { UI ui = sess.getUI(); if (ui == null) return; Tex at = sess.getAvatar(); int avoffset = LEFT_OFFSET + index * (avasz.x + 2 * BORDER); // display empty box for login screen if (at == null) { g.chcolor(color); Window.wbox.draw(g, Coord.z.add(avoffset, 0), avasz.add(Window.wbox.bisz()).add(unborder.mul(2).inv())); g.image(bg, Coord.z.add(avoffset + BORDER, BORDER), avasz); if (MaidFrame.getCurrentSession() == sess) { g.chcolor(Color.RED); g.rect(Coord.z.add(avoffset + BORDER + 1, BORDER + 1), avasz); } g.chcolor(); return; } GOut g2 = g.reclip(Window.wbox.tloff().add(unborder.inv()).add(avoffset, 0), avasz); // g2.image(Equipory.bg, new Coord(Equipory.bg.sz().x / 2 - asz.x / 2, // 20).inv().add(off)); int yo = (20 * avasz.y) / dasz.y; Coord tsz = new Coord((at.sz().x * avasz.x) / dasz.x, (at.sz().y * avasz.y) / dasz.y); g2.image(bg, new Coord(tsz.x / 2 - avasz.x / 2, yo).inv(), tsz); g2.image(at, new Coord(tsz.x / 2 - avasz.x / 2, yo).inv(), tsz); if (MaidFrame.getCurrentSession() == sess) { g2.chcolor(Color.RED); g2.rect(new Coord(1, 1), avasz); } g.chcolor(color); Window.wbox.draw(g, Coord.z.add(avoffset, 0), avasz.add(Window.wbox.bisz()).add(unborder.mul(2).inv())); g.chcolor(); } public void wdgmsg(Widget sender, String msg, Object... args) { if (sender == cbtn) ui.destroy(this); if (sender == fbtn) super.wdgmsg(sender, msg, args); } private int getClickedAvatarIndex(int x) { int index = (x - LEFT_OFFSET) / (2 * BORDER + avasz.x); if (x <= LEFT_OFFSET || index >= MaidFrame.getSessionList().size()) return -1; return index; } @Override protected void recalcsz(Coord max) { if (folded) { wsz.x = 15; wsz.y = 15; } else { wsz.x = LEFT_OFFSET + (avasz.x + 2 * BORDER) * MaidFrame.getSessionCount(); wsz.y = avasz.y + 2 * BORDER; } sz = asz = wsz; } @Override public boolean mousedown(Coord c, int button) { if (button == 1) { int i = getClickedAvatarIndex(c.x); if (i >= 0) MaidFrame.switchToSession(i); else super.mousedown(c, button); } else { super.mousedown(c, button); } return (true); } @Override public void mousemove(Coord c) { if (dm) { this.c = this.c.add(c.add(doff.inv())); List<SessionData> sesList = MaidFrame.getSessionList(); for (SessionData s : sesList) { if (s != null && s.sb != null) s.sb.c = this.c; } } else { super.mousemove(c); } } @Override public Object tooltip(Coord c, boolean again) { Tex tooltip = null; String name = null; int i = getClickedAvatarIndex(c.x); List<SessionData> sess = MaidFrame.getSessionList(); if (i >= 0) name = sess.get(i).getUI().sess != null ? sess.get(i).getUI().sess.charname : null; if (name != null) tooltip = new TexI(Utils.outline2(nfnd.render(name, Color.GREEN).img, Color.BLACK)); if (tooltip != null) return (tooltip); else return (""); } }