Skip to content

Commit

Permalink
Reworked first user experience to be more discoverable
Browse files Browse the repository at this point in the history
Before user had to know to use "Tools->Review Changes" for dialog to appear
Now after installing plugin, dialog will show up in bottom-right corner automatically only remaining action user will need to do, is click very visible "Start Review" button. I also added "Toggle" button with tooltip explaining about Spacebar and double-click.
  • Loading branch information
DavidKarlas committed Oct 10, 2021
1 parent 0583fc4 commit 23ed4b4
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 70 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ josm {
debugPort = 2019
josmCompileVersion = "18193"
manifest {
version = "1.0.2"
version = "1.0.3"
description = "JOSM plugin for reviewing changes."
mainClass = "org.openstreetmap.josm.plugins.davidkarlas.JosmReviewPlugin.JosmReviewPlugin"
minJosmVersion = "18193"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
package org.openstreetmap.josm.plugins.davidkarlas.JosmReviewPlugin;

import org.openstreetmap.josm.gui.MainApplication;
import org.openstreetmap.josm.gui.MainMenu;
import org.openstreetmap.josm.gui.MapFrame;
import org.openstreetmap.josm.plugins.Plugin;
import org.openstreetmap.josm.plugins.PluginInformation;

public class JosmReviewPlugin extends Plugin {
StartReviewAction startReviewAction;
public JosmReviewPlugin(PluginInformation info) {
super(info);

startReviewAction = new StartReviewAction();
MainMenu.add(MainApplication.getMenu().toolsMenu, startReviewAction);
}

@Override
public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
ReviewListDialog existingDialog=MainApplication.getMap().getToggleDialog(ReviewListDialog.class);
if (existingDialog != null) {
oldFrame.removeToggleDialog(existingDialog);
}
newFrame.addToggleDialog(new ReviewListDialog());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,20 @@

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import java.awt.event.MouseEvent;

import javax.swing.AbstractAction;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;

import java.awt.event.MouseAdapter;

import org.openstreetmap.josm.data.APIDataSet;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.data.osm.DataSelectionListener;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.event.SelectionEventManager;
Expand All @@ -24,6 +27,8 @@
import org.openstreetmap.josm.gui.SideButton;
import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
import org.openstreetmap.josm.tools.Shortcut;

import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

Expand All @@ -37,9 +42,9 @@ public ReviewListDialog() {
super(tr("Review List"), "reviewPlugin/icon", tr("Open the review list window."),
Shortcut.registerShortcut("subwindow:reviewchanges", tr("Windows: {0}", tr("Review List")),
KeyEvent.VK_E, Shortcut.ALT_SHIFT),
350, false);
200, true);

List<SideButton> buttons = new LinkedList<>();
List<AbstractAction> buttons = new LinkedList<>();

displayList = new JList<>(model);
displayList.setCellRenderer(new ReviewItemRenderer());
Expand Down Expand Up @@ -86,15 +91,28 @@ public void keyReleased(KeyEvent e) {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
ReviewItem sel = displayList.getSelectedValue();
if (sel == null)
return;
model.ToggleReviewed(sel);
ToggleReviewed();
}
}
});
buttons.add(new StartReviewAction());
buttons.add(new JosmAction("Toggle", "reviewplugin/ReviewedItem", "Toggles state of currently selected item. You can also use Spacebar key or double-click with mouse.",
Collections.singletonList(null)) {
@Override
public void actionPerformed(ActionEvent e) {
ToggleReviewed();
}
});

createLayout(displayList, true,
buttons.stream().map((AbstractAction a) -> new SideButton(a)).collect(Collectors.toList()));
}

createLayout(displayList, true, buttons);
protected void ToggleReviewed() {
ReviewItem sel = displayList.getSelectedValue();
if (sel == null)
return;
model.ToggleReviewed(sel);
}

@Override
Expand All @@ -119,8 +137,8 @@ protected void ZoomToSelectedItem() {
MainApplication.getLayerManager().getEditDataSet().setSelected(sel.getItem());
}

public void setData(APIDataSet apiData) {
model.UpdateData(apiData);
public void StartReview() {
model.StartReview();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,27 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;

import javax.swing.AbstractListModel;
import javax.swing.JOptionPane;

import org.openstreetmap.josm.data.APIDataSet;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.data.osm.Way;
import org.openstreetmap.josm.gui.MainApplication;
import org.openstreetmap.josm.gui.Notification;

public class ReviewListModel extends AbstractListModel<ReviewItem> {
private APIDataSet data;
private List<ReviewItem> items;
private List<ReviewItem> items = new LinkedList<>();

public void UpdateData(APIDataSet data) {
this.data = data;
public void StartReview() {
// TODO: Don't lose state of already reviewed items...
APIDataSet data = new APIDataSet(MainApplication.getLayerManager().getActiveDataSet());
items = new ArrayList<>();
LinkedHashSet<OsmPrimitive> newItems = new LinkedHashSet<>();
LinkedHashSet<Way> parentWays = new LinkedHashSet<>();
Expand Down Expand Up @@ -69,6 +74,11 @@ public int compare(ReviewItem o1, ReviewItem o2) {
}
});
fireContentsChanged(this, 0, getSize());

if (getSize() == 0) {
new Notification("No changes detected.").setIcon(JOptionPane.INFORMATION_MESSAGE)
.setDuration(Notification.TIME_SHORT).show();
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,70 +2,27 @@

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeListener;

import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.data.APIDataSet;
import org.openstreetmap.josm.gui.MainApplication;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
import org.openstreetmap.josm.tools.Shortcut;
import org.openstreetmap.josm.tools.ImageProvider;

public class StartReviewAction extends JosmAction {
ReviewListDialog reviewListDialog;

public StartReviewAction() {
super("Review Changes", new ImageProvider("dialogs/reviewPlugin/icon"), "Review Changes",
Shortcut.registerShortcut("Review Changes", "Review Changes", KeyEvent.VK_R, Shortcut.CTRL_SHIFT),
super("Start Review", new ImageProvider("dialogs/reviewPlugin/icon"),
"Shows 'Review Changes' pad and updates content with latest changes to be reviewed.",
Shortcut.registerShortcut("Start Review",
"Shows 'Review Changes' pad and updates content with latest changes to be reviewed.",
KeyEvent.VK_R, Shortcut.CTRL_SHIFT),
false, "reviewChanges", true);
}

@Override
public void actionPerformed(ActionEvent event) {
if (MainApplication.getMap().getToggleDialog(ReviewListDialog.class) == null) {
reviewListDialog = new ReviewListDialog();
}
APIDataSet apiData = new APIDataSet(getLayerManager().getEditDataSet());
reviewListDialog.setData(apiData);

if (MainApplication.getMap().getToggleDialog(ReviewListDialog.class) == null) {
MainApplication.getMap().addToggleDialog(reviewListDialog);
}
ReviewListDialog reviewListDialog = MainApplication.getMap().getToggleDialog(ReviewListDialog.class);
reviewListDialog.StartReview();
reviewListDialog.buttonShown();
}

@Override
protected void updateEnabledState() {
OsmDataLayer editLayer = getLayerManager().getEditLayer();
setEnabled(editLayer != null && editLayer.requiresUploadToServer());
}

private final PropertyChangeListener updateOnRequireUploadChange = evt -> {
if (OsmDataLayer.REQUIRES_UPLOAD_TO_SERVER_PROP.equals(evt.getPropertyName())) {
updateEnabledState();
}
};

@Override
protected LayerChangeAdapter buildLayerChangeAdapter() {
return new LayerChangeAdapter() {
@Override
public void layerAdded(LayerAddEvent e) {
if (e.getAddedLayer() instanceof OsmDataLayer) {
e.getAddedLayer().addPropertyChangeListener(updateOnRequireUploadChange);
}
super.layerAdded(e);
}

@Override
public void layerRemoving(LayerRemoveEvent e) {
if (e.getRemovedLayer() instanceof OsmDataLayer) {
e.getRemovedLayer().removePropertyChangeListener(updateOnRequireUploadChange);
}
super.layerRemoving(e);
}
};
}
}

0 comments on commit 23ed4b4

Please sign in to comment.