package nars.gui.output; import automenta.vivisect.Video; import automenta.vivisect.swing.NPanel; import automenta.vivisect.swing.NSlider; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.SwingUtilities; import static javax.swing.SwingUtilities.invokeLater; import nars.util.EventEmitter.EventObserver; import nars.NAR; import nars.entity.Task; import nars.gui.output.graph.deprecated.ProcessingGraphPanel2; import nars.io.Output; import nars.gui.util.DefaultGraphizer; import nars.gui.util.NARGraph; import org.jgrapht.graph.DirectedMultigraph; /** * * @author me */ public class MultiModePanel extends NPanel implements EventObserver { final float activityIncrement = 0.5f; //per output final float activityMomentum = 0.95f; private final NAR nar; private final Object object; float activity = 0; //private final String label; private final String label; MultiViewMode currentMode = null; public interface MultiViewMode { public void setFontSize(float newSize); public void output(Class c, Object s); } /** extension of SwingLogText with functionality specific to MultiLogPanel */ public class LogView extends SwingLogText implements MultiViewMode { public LogView() { super(nar); SwingLogPanel.setConsoleFont(this); } } public class GraphView extends ProcessingGraphPanel2 implements MultiViewMode, Runnable { @Override public DirectedMultigraph getGraph() { //TODO udpate this return new NARGraph().add(nar, NARGraph.IncludeEverything, new DefaultGraphizer(true,true,true,true,0,false, false, null) ); } @Override public void setFontSize(float newSize) { } @Override public void output(Class channel, Object signal) { addItem(signal); update(); /*if (!needsUpdate)*/ { needsUpdate = true; SwingUtilities.invokeLater(this); } } boolean needsUpdate = false; @Override public void run() { needsUpdate = false; redraw(); } //TODO ------------ @Override public int edgeColor(Object edge) { throw new UnsupportedOperationException("Not supported yet."); } @Override public float edgeWeight(Object edge) { throw new UnsupportedOperationException("Not supported yet."); } @Override public int vertexColor(Object vertex) { throw new UnsupportedOperationException("Not supported yet."); } } public class GraphView2 { /* Window w = new Window("Edit",new JGraphXGraphPanel(nar)); w.setVisible(true); w.pack(); */ } @Override protected void onShowing(boolean showing) { nar.event().set(this, showing, Output.DefaultOutputEvents); } @Override public void event(Class event, Object[] arguments) { output(event, arguments.length > 1 ? arguments : arguments[0]); } public MultiModePanel(NAR nar, Object object) { super(new BorderLayout()); this.nar = nar; this.object = object; if (object instanceof Task) { label = ((Task)object).sentence.toString(); } else { label = object.toString(); } //Default View setMode(new LogView()); } public void setMode(MultiViewMode mode) { invokeLater(new Runnable() { @Override public void run() { if (currentMode!=null) remove((JComponent)currentMode); currentMode = mode; add((JComponent)mode, BorderLayout.CENTER); } }); } public JMenu newMenu() { JMenu m = new JMenu("\uf085"); m.setFont(Video.FontAwesome); m.add(new JMenuItem("Statement List")); JMenuItem log; m.add(log = new JMenuItem("Log")); log.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setMode(new LogView()); } }); JMenuItem conceptNetwork; m.add(conceptNetwork = new JMenuItem("Concepts Network")); conceptNetwork.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setMode(new GraphView()); } }); m.add(new JMenuItem("Concept List")); m.add(new JMenuItem("Concept Cloud")); m.add(new JMenuItem("Statements Network")); m.add(new JMenuItem("Truth vs. Confidence")); m.addSeparator(); NSlider fontSlider; fontSlider = new NSlider() { // (float)11, 6.0f, 40.0f) { @Override public void onChange(float v) { setFontSize(v); } }; fontSlider.setMin(6f); fontSlider.setMax(40f); fontSlider.setValue(11f); JPanel fontPanel = new JPanel(new BorderLayout()); fontSlider.setPrefix("Font size: "); fontPanel.add(fontSlider); m.add(fontPanel); JPanel priorityPanel = new JPanel(new FlowLayout()); priorityPanel.add(new JButton("+")); priorityPanel.add(new JLabel("Priority")); priorityPanel.add(new JButton("-")); m.add(priorityPanel); m.addSeparator(); m.add(new JMenuItem("Close")); return m; } public void setFontSize(float newSize) { if (currentMode!=null) { currentMode.setFontSize(newSize); } } public String getLabel() { return label; } public JButton newStatusButton() { JButton statusButton = new JButton(" " + getLabel()) { Color bgColor = Color.WHITE; private Color fgColor = Color.WHITE; @Override public void paint(Graphics g) { int h = getHeight(); bgColor = new Color(activity/2, activity*activity,0 ); if (object instanceof Task) { Task task = (Task)object; fgColor = new Color( 0.75f + 0.25f * task.getPriority(), 0.75f + 0.25f * task.getDurability(), 0.75f + 0.25f * task.getQuality()); } setForeground(fgColor); /*g.setColor(c); g.fillRect(0, 0, getWidth(), getHeight()); */ super.paint(g); g.setColor(bgColor); g.fillRect(2, 2, h/2-2, h-2); } }; return statusButton; } public void output(final Class channel, final Object signal) { if (currentMode!=null) currentMode.output(channel, signal); updateActivity(activity + activityIncrement); } public void updateActivity(float newActivity) { if (activity!=newActivity) { activity = newActivity; if (activity > 1.0f) activity = 1.0f; } } public void decayActvity() { updateActivity(activity * activityMomentum); } }