X-Git-Url: https://ruin.nu/git/?p=moosique.git;a=blobdiff_plain;f=MooTrackView.java;h=c284e7df5acc9e4ce2a2407f67f373e5fdf548aa;hp=2f96085e25f6a362ea22b4d34e28045ac7177736;hb=HEAD;hpb=f7097bc07b6688d1629e6894c1c42dc06485dc12 diff --git a/MooTrackView.java b/MooTrackView.java index 2f96085..c284e7d 100644 --- a/MooTrackView.java +++ b/MooTrackView.java @@ -18,20 +18,20 @@ public class MooTrackView extends JPanel { private MooKeyboard keyboard; private JPopupMenu popup, selPopup; - private JMenu selPopupTranspUp, selPopupTranspDown; - private JMenuItem popupAdd, popupPaste; - private JMenuItem selPopupCopy, selPopupCut, selPopupRemove; + private JMenu popupAdd, selPopupTranspUp, selPopupTranspDown; + private JMenuItem popupAddItemsCustom, popupAddItemsLast, popupPaste; + private JMenuItem popupAddItemsWhole, popupAddItemsHalf, popupAddItemsQuarter, popupAddItemsEighth, popupAddItemsSixteenth; + private JMenuItem selPopupProps, selPopupCopy, selPopupCut, selPopupRemove; private JMenuItem[] selPopupTranspUpItems, selPopupTranspDownItems; private ArrayList coords; - private TreeSet selection; private Insets insets; private Rectangle box; - private int ticksPerSixteenth, popupY = 0; + private int ticksPerSixteenth, popupY = 0, lastNoteLength = 2; private boolean leftMouseButtonPressed = false; private static boolean snapToSixteenths = true; - protected static int viewLength = 0; - protected static int extraHeight = 0; + private static int viewLength = 0; + private static int extraHeight = 0; public static final int NOTE_HEIGHT = 10, NOTE_WIDTH = 40, VIEW_WIDTH = 200; /** @@ -45,7 +45,9 @@ public class MooTrackView extends JPanel { // Defines instance variables this.track = track; this.title = title; + ticksPerSixteenth = Moosique.getSequence().getResolution() / 4; insets = getInsets(); + coords = new ArrayList(track.size() / 2); // Configures panel setBackground(Color.white); @@ -53,15 +55,41 @@ public class MooTrackView extends JPanel { setLayout(null); setPreferredSize(new Dimension(VIEW_WIDTH, 140 * NOTE_HEIGHT)); - placeNoteElements(); + // Creates temporary variables + MidiEvent note; + MooNoteElement elem; + extraHeight = Toolkit.getDefaultToolkit().getScreenSize().height - 150; + + // Places note elements + for (int i = 0; i < track.size(); i++) { + note = track.get(i); + if (note instanceof MooNote) { + // Adds the note element to the note area and moves it to the appropriate place. + MooNote mn = (MooNote)note; + elem = new MooNoteElement(this, mn); + add(elem); + layoutElement(elem, false); + } + } + setPreferredSize(new Dimension(VIEW_WIDTH, viewLength + extraHeight)); // Creates panel pop-up menu. popup = new JPopupMenu(); - popupAdd = addMenuItem(popup, "Add note..."); + popupAdd = new JMenu("Add note"); + popup.add(popupAdd); + popupAddItemsCustom = addMenuItem(popupAdd, "Custom..."); + popupAddItemsLast = addMenuItem(popupAdd, "As last added"); + popupAdd.addSeparator(); + popupAddItemsWhole = addMenuItem(popupAdd, "Whole"); + popupAddItemsHalf = addMenuItem(popupAdd, "Half"); + popupAddItemsQuarter = addMenuItem(popupAdd, "Quarter"); + popupAddItemsEighth = addMenuItem(popupAdd, "Eighth"); + popupAddItemsSixteenth = addMenuItem(popupAdd, "Sixteenth"); popupPaste = addMenuItem(popup, "Paste"); // Creates selection pop-up menu. selPopup = new JPopupMenu(); + selPopupProps = addMenuItem(selPopup, "Properties..."); selPopupCopy = addMenuItem(selPopup, "Copy selection"); selPopupCut = addMenuItem(selPopup, "Cut selection"); selPopupRemove = addMenuItem(selPopup, "Remove selection"); @@ -77,22 +105,17 @@ public class MooTrackView extends JPanel { } /** - * Creates note elements for all MooNotes in the track, and places them in the appropriate place. + * Creates note elements for all MooNotes in the given list, and places them in the appropriate place. */ - public void placeNoteElements() { - // Empties the container - removeAll(); - coords = new ArrayList(track.size() / 2); - selection = new TreeSet(); - + public void placeNewNotes(java.util.List notes) { // Creates temporary variables MidiEvent note; MooNoteElement elem; extraHeight = Toolkit.getDefaultToolkit().getScreenSize().height - 150; // Places note elements - for (int i = 0; i < track.size(); i++) { - note = track.get(i); + for (int i = 0; i < notes.size(); i++) { + note = (MidiEvent)notes.get(i); if (note instanceof MooNote) { // Adds the note element to the note area and moves it to the appropriate place. MooNote mn = (MooNote)note; @@ -100,8 +123,8 @@ public class MooTrackView extends JPanel { add(elem); layoutElement(elem, false); } - setPreferredSize(new Dimension(VIEW_WIDTH, viewLength + extraHeight)); } + setPreferredSize(new Dimension(VIEW_WIDTH, viewLength + extraHeight)); } /** @@ -124,7 +147,6 @@ public class MooTrackView extends JPanel { } // Creates temporary variables. - ticksPerSixteenth = Moosique.getSequence().getResolution() / 4; MooNote mn = elem.getNote(); int x, y, height; @@ -196,10 +218,11 @@ public class MooTrackView extends JPanel { /** * Adds a standard note to this track. */ - private void addStandardNote() { + private void addNoteAtClickY(int length) { + lastNoteLength = length; int row = (popupY - insets.top) / NOTE_HEIGHT; long timestamp = (long)(ticksPerSixteenth * row); - addNote(new MooNote(title.getChannel(), 60, 100, timestamp, Moosique.getSequence().getResolution() / 4)); + addNote(new MooNote(title.getChannel(), 60, 100, timestamp, ticksPerSixteenth * length)); } /** @@ -217,49 +240,11 @@ public class MooTrackView extends JPanel { repaint(); } - /** - * Selects the given note - * @param the note to select - */ - public void selectNote(MooNoteElement elem) { - selection.add(elem); - } - - /** - * Deselects the given note - * @param the note to deselect - */ - public void deselectNote(MooNoteElement elem) { - selection.remove(elem); - } - - /** - * Deselects all notes. - */ - public void deselectAllNotes() { - Iterator it = selection.iterator(); - while(it.hasNext()) { - ((MooNoteElement)it.next()).deselect(); - } - selection.clear(); - } - - /** - * Determines if the given MooNoteElement is the only one in the track view that is selected. - * @return if the given element is the only selected one - */ - public boolean isTheOnlySelected(MooNoteElement elem) { - Iterator it = selection.iterator(); - while(it.hasNext()) { - if (!it.next().equals(elem)) return false; - } - return true; - } - /** * Copies the current selection. */ public void copySelectedNotes() { + TreeSet selection = Moosique.getSelection(); ArrayList copyBuffer = new ArrayList(selection.size()); Iterator it = selection.iterator(); while(it.hasNext()) { @@ -293,6 +278,7 @@ public class MooTrackView extends JPanel { mn.setChannel(title.getChannel()); addNote(mn); } + Moosique.setEdited(); } } @@ -300,22 +286,26 @@ public class MooTrackView extends JPanel { * Removes the current selection. */ public void removeSelectedNotes() { + TreeSet selection = Moosique.getSelection(); Iterator it = selection.iterator(); while(it.hasNext()) { removeNote((MooNoteElement)it.next()); } selection.clear(); + Moosique.setEdited(); } /** * Transposes all selected notes the given number of halftones. */ private void transposeSelectedNotes(int halftones) { + TreeSet selection = Moosique.getSelection(); Iterator it = selection.iterator(); while(it.hasNext()) { MooNoteElement elem = (MooNoteElement)it.next(); elem.transpose(halftones); } + Moosique.setEdited(); } /** @@ -323,6 +313,7 @@ public class MooTrackView extends JPanel { * @param ticks the number of ticks to move the selection. */ public void moveSelectedNotes(int ticks) { + TreeSet selection = Moosique.getSelection(); if (ticks < 0) { // If the selection should be moved upwards, traverses the list in the natural order. Iterator it = selection.iterator(); @@ -341,14 +332,7 @@ public class MooTrackView extends JPanel { layoutElement(elem, true); } } - } - - /** - * Moves the current selection, depending on the given delta y. - * @param y the number of pixels the selection is moved. - */ - public void maybeMoveSelectedNotes(int y) { - moveSelectedNotes(ticksPerSixteenth * (y / NOTE_HEIGHT)); + Moosique.setEdited(); } /** @@ -406,6 +390,8 @@ public class MooTrackView extends JPanel { * @param y the y-coordinate in which to display the menu */ public void showSelectionPopup(Component c, int x, int y) { + // Determines whether the "Properties" item should be available. + selPopupProps.setEnabled(Moosique.getSelection().size() == 1); selPopup.show(c, x, y); } @@ -443,10 +429,10 @@ public class MooTrackView extends JPanel { */ public void mouseClicked(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { - deselectAllNotes(); + Moosique.deselectAllNotes(); if (e.getClickCount() == 2) { popupY = e.getY(); - addStandardNote(); + addNoteAtClickY(lastNoteLength); } } } @@ -487,11 +473,28 @@ public class MooTrackView extends JPanel { public void actionPerformed(ActionEvent e) { Object source = e.getSource(); // Handling panel popup actions. - if (source == popupAdd) { - addStandardNote(); + if (source == popupAddItemsLast) { + addNoteAtClickY(lastNoteLength); + } else if (source == popupAddItemsCustom) { + /* Show the user a dialog (identical to note preferences... + then call addNote(new MooNote( + title.getChannel(), pitch, velocity, timestamp, duration)); + */ + } else if (source == popupAddItemsWhole) { + addNoteAtClickY(16); + } else if (source == popupAddItemsHalf) { + addNoteAtClickY(8); + } else if (source == popupAddItemsQuarter) { + addNoteAtClickY(4); + } else if (source == popupAddItemsEighth) { + addNoteAtClickY(2); + } else if (source == popupAddItemsSixteenth) { + addNoteAtClickY(1); } else if (source == popupPaste) { pasteCopiedNotes(); // Handling selection popup actions. + } else if (source == selPopupProps) { + new MooDialog(((MooNoteElement)Moosique.getSelection().first()).getNote()); } else if (source == selPopupCopy) { copySelectedNotes(); } else if (source == selPopupCut) {