From 7edb711c7c612eaaac882c0f26fa50560fa8d8e4 Mon Sep 17 00:00:00 2001 From: Mat Booth Date: Sat, 15 Oct 2022 14:22:50 +0100 Subject: [PATCH] Fixes launchbar icons looking blurry on hidpi screens The launchbar way of compositing images for the buttons was preventing the use of higher quality icons on hidpi dislays, making the launchbar buttons look blurry or pixelated compared to other toolbar buttons. Instead we can get a nicer result with a custom widget on which we can directly draw a button border plus the hidpi version of the icon. Also included is an attempt at a 2x hammer build button icon, which should look a bit nicer on hidpi screens. --- .../icons/dlcl16/build_exec@2x.png | Bin 0 -> 7395 bytes .../icons/elcl16/build_exec@2x.png | Bin 0 -> 7873 bytes .../icons/bgButton.png | Bin 1163 -> 0 bytes .../icons/{build_16.png => build_exec.png} | Bin .../icons/build_exec@2x.png | Bin 0 -> 7873 bytes .../icons/launch_16.png | Bin 620 -> 0 bytes .../icons/stop_16.png | Bin 330 -> 0 bytes .../ui/controls/internal/Activator.java | 20 ++- .../ui/controls/internal/CLaunchButton.java | 117 ++++++++++++++++++ .../LaunchBarButtonImageDescriptor.java | 54 -------- .../controls/internal/LaunchBarControl.java | 36 +++--- .../ui/controls/internal/ModeSelector.java | 49 ++------ 12 files changed, 156 insertions(+), 120 deletions(-) create mode 100644 core/org.eclipse.cdt.ui/icons/dlcl16/build_exec@2x.png create mode 100644 core/org.eclipse.cdt.ui/icons/elcl16/build_exec@2x.png delete mode 100644 launchbar/org.eclipse.launchbar.ui.controls/icons/bgButton.png rename launchbar/org.eclipse.launchbar.ui.controls/icons/{build_16.png => build_exec.png} (100%) create mode 100644 launchbar/org.eclipse.launchbar.ui.controls/icons/build_exec@2x.png delete mode 100644 launchbar/org.eclipse.launchbar.ui.controls/icons/launch_16.png delete mode 100644 launchbar/org.eclipse.launchbar.ui.controls/icons/stop_16.png create mode 100644 launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/CLaunchButton.java delete mode 100644 launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/LaunchBarButtonImageDescriptor.java diff --git a/core/org.eclipse.cdt.ui/icons/dlcl16/build_exec@2x.png b/core/org.eclipse.cdt.ui/icons/dlcl16/build_exec@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c40d92c51174b7eb76a1f46f5c79790d4e3ac380 GIT binary patch literal 7395 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 literal 0 HcmV?d00001 diff --git a/core/org.eclipse.cdt.ui/icons/elcl16/build_exec@2x.png b/core/org.eclipse.cdt.ui/icons/elcl16/build_exec@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..420e5384b5149ff7339616b3223d121ca1a5c7f3 GIT binary patch literal 7873 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 Ghy4qr#k&~* literal 0 HcmV?d00001 diff --git a/launchbar/org.eclipse.launchbar.ui.controls/icons/bgButton.png b/launchbar/org.eclipse.launchbar.ui.controls/icons/bgButton.png deleted file mode 100644 index e951bd34a153dfe905a255e28ce45004e1c6024c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1163 zcmV;61a$j}P)4Tx062|}Rb6NtRTMtEb7vzY&QokOg>Hg1+lHrgWS zWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6wD^Ni=!>T7nL9I? zX}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8rehoBb*p;u8ID_yBf z0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J`jH<$>RKN5V(7Oq zK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYvwjAKwmYb0gKL(K8 z-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z>!FI&AHCpoWI|RUq zx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVTrI(b06~u#xf1yS} z_UGdMvD``!0~u->P=lA4?YN`hilQ|3tHka)7T{2CGqw zjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^7T9R1gAN8V6s;5) zieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2bW$~+pTw@bIek?Zv zKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L_AC5qq~L$#SMj%U z$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6=b6>{xYV#Ue-+LB$ z7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re4r3qYr~6#KE>;1F z`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+5K}u-6REM(K@W$s zrgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5h^QEb$V`rCQ-|7Z zS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX2i^rZ^Mu;6+rb@? zNPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV0id6JRZw95ZvX%Q zIY~r8R7ef&*0Bu$Fbo2)rvHnVTjdHC=K+W(CdoU^YZln-+kAer6(B%>009C72oNAJ d%~iak^aJ5;3encFAQ%7u002ovPDHLkV1fqPHPZk9 diff --git a/launchbar/org.eclipse.launchbar.ui.controls/icons/build_16.png b/launchbar/org.eclipse.launchbar.ui.controls/icons/build_exec.png similarity index 100% rename from launchbar/org.eclipse.launchbar.ui.controls/icons/build_16.png rename to launchbar/org.eclipse.launchbar.ui.controls/icons/build_exec.png diff --git a/launchbar/org.eclipse.launchbar.ui.controls/icons/build_exec@2x.png b/launchbar/org.eclipse.launchbar.ui.controls/icons/build_exec@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..420e5384b5149ff7339616b3223d121ca1a5c7f3 GIT binary patch literal 7873 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 Ghy4qr#k&~* literal 0 HcmV?d00001 diff --git a/launchbar/org.eclipse.launchbar.ui.controls/icons/launch_16.png b/launchbar/org.eclipse.launchbar.ui.controls/icons/launch_16.png deleted file mode 100644 index 08571c1f22ed976c9cc9333c892c8f43a6219f4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmV-y0+aoTP)FX z?f<+xh5u(<&;MU{IOTuD^042M<#yl2OYM?yYL>5Y{8)W3>HpH39sf7qpY^}*d=?4@ z$*DKFd=x9P&BSoFc$wXov<*@JYY!&>pLenAKM3r)w+75d#>Kl5{sX=9RhgEM+cAJKmMPz zJQc167}#%x${b|C28fo}{IKow`VYf-tIGdl0~7bpgsTC1`=dmGg90QBN^Bq5^m_ky znBW7(1#2o%H2(ba^MB*EPPn{npZ9-}Vw>LxFO=9$(`$A6>pa=_KL{7CtAcBO`}N)b zoYf`&VR9gB(&+*8g6$Ew0iY-mFR}UPJjL(7+cf|GB^w}NaR2SY|FMfx!D2A%0#qYW zZu?E7#Kr+NA(hyc%2hdjbe$UTKW#r% diff --git a/launchbar/org.eclipse.launchbar.ui.controls/icons/stop_16.png b/launchbar/org.eclipse.launchbar.ui.controls/icons/stop_16.png deleted file mode 100644 index 3544673b6896bb23b647944436a07b398c165967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330 zcmV-Q0k!^#P)HWWthq_^V5`=f3`bKy?qW8gNiVIsK@N*2hx@Hve(q!; { + if (pressed && hover) { + e.gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); + } else if (hover) { + e.gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW)); + } else { + e.gc.setBackground(getBackground()); + } + int arc = 3; + Point size = getSize(); + e.gc.fillRoundRectangle(0, 0, size.x - 1, size.y - 1, arc, arc); + if (image != null) { + e.gc.drawImage(image, 10, 5); + } + e.gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); + e.gc.drawRoundRectangle(0, 0, size.x - 1, size.y - 1, arc, arc); + }); + + addMouseMoveListener(e -> { + // We don't get enter and exit events whilst a mouse button is down i.e., during click-drag, + // so we also need to track the hover state here because during a click-drag we still get + // move events even when the pointer is not over the control + if (e.getSource() instanceof Control button) { + Point size = button.getSize(); + if (e.x >= 0 && e.x < size.x && e.y >= 0 && e.y < size.y) { + hover = true; + } else { + hover = false; + } + redraw(); + } + }); + addMouseTrackListener(MouseTrackListener.mouseEnterAdapter(e -> { + hover = true; + redraw(); + })); + addMouseTrackListener(MouseTrackListener.mouseExitAdapter(e -> { + hover = false; + redraw(); + })); + addMouseListener(MouseListener.mouseDownAdapter(e -> { + pressed = true; + redraw(); + })); + addMouseListener(MouseListener.mouseUpAdapter(e -> { + if (pressed && hover) { + notifyListeners(SWT.Selection, null); + } + pressed = false; + redraw(); + })); + } + + public void addSelectionListener(SelectionListener listener) { + checkWidget(); + if (listener == null) { + SWT.error(SWT.ERROR_NULL_ARGUMENT); + } + TypedListener typedListener = new TypedListener(listener); + addListener(SWT.Selection, typedListener); + } + + @Override + public Point computeSize(int wHint, int hHint, boolean changed) { + int width = 0; + int height = 0; + if (image != null) { + Rectangle bounds = image.getBounds(); + width = bounds.width + 20; + height = bounds.height + 10; + } + return new Point(width, height); + } + + public void setImage(Image image) { + this.image = image; + redraw(); + } +} diff --git a/launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/LaunchBarButtonImageDescriptor.java b/launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/LaunchBarButtonImageDescriptor.java deleted file mode 100644 index 80047ba9a0d..00000000000 --- a/launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/LaunchBarButtonImageDescriptor.java +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 QNX Software Systems and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Doug Schaefer - initial API and implementation - * Elena Laskavaia - moved to a separate class - *******************************************************************************/ -package org.eclipse.launchbar.ui.controls.internal; - -import org.eclipse.jface.resource.CompositeImageDescriptor; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; - -/** - * This class will take two images and create descriptor that will overlay them, mainImage will be centered - */ -public class LaunchBarButtonImageDescriptor extends CompositeImageDescriptor { - private Image bgImage; - private Image mainImage; - - /** - * @param mainImage - main image, will be centered - * @param bgImage - background image - */ - public LaunchBarButtonImageDescriptor(Image mainImage, Image bgImage) { - super(); - this.bgImage = bgImage; - this.mainImage = mainImage; - } - - @Override - protected Point getSize() { - Rectangle bounds = bgImage.getBounds(); - return new Point(bounds.width - bounds.y, bounds.height - bounds.x); - } - - @Override - protected void drawCompositeImage(int width, int height) { - drawImage(bgImage.getImageData(), 0, 0); - Rectangle bgBounds = bgImage.getBounds(); - Rectangle modeBounds = mainImage.getBounds(); - int x = ((bgBounds.width - bgBounds.x) - (modeBounds.width - modeBounds.x)) / 2; - int y = ((bgBounds.height - bgBounds.y) - (modeBounds.height - modeBounds.y)) / 2; - drawImage(mainImage.getImageData(), x, y); - } -} diff --git a/launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/LaunchBarControl.java b/launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/LaunchBarControl.java index 90d31b71a62..8573fc18afe 100644 --- a/launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/LaunchBarControl.java +++ b/launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/LaunchBarControl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2014, 2018 QNX Software Systems and others. + * Copyright (c) 2014, 2022 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -23,8 +23,9 @@ import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.debug.core.ILaunchMode; +import org.eclipse.debug.ui.DebugUITools; +import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.launchbar.core.ILaunchBarListener; import org.eclipse.launchbar.core.ILaunchBarManager; import org.eclipse.launchbar.core.ILaunchDescriptor; @@ -33,13 +34,12 @@ import org.eclipse.launchbar.ui.ILaunchBarUIConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.ToolBar; -import org.eclipse.swt.widgets.ToolItem; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.handlers.IHandlerService; @@ -71,18 +71,22 @@ public class LaunchBarControl implements ILaunchBarListener { container.setLayout(layout); container.addDisposeListener(e -> LaunchBarControl.this.dispose()); - ToolBar toolBar = new ToolBar(container, SWT.FLAT); + Composite buttons = new Composite(container, SWT.NONE); + FillLayout fillLayout = new FillLayout(); + fillLayout.spacing = 5; + buttons.setLayout(fillLayout); + IPreferenceStore store = Activator.getDefault().getPreferenceStore(); boolean buildEnabled = store.getBoolean(Activator.PREF_ENABLE_BUILDBUTTON); if (buildEnabled) { - createButton(toolBar, Activator.IMG_BUTTON_BUILD, Messages.LaunchBarControl_Build, - ILaunchBarUIConstants.CMD_BUILD); + Image imageBuild = Activator.getDefault().getImageRegistry().get(Activator.IMG_BUTTON_BUILD); + createButton(buttons, imageBuild, Messages.LaunchBarControl_Build, ILaunchBarUIConstants.CMD_BUILD); } - createButton(toolBar, Activator.IMG_BUTTON_LAUNCH, Messages.LaunchBarControl_Launch, - ILaunchBarUIConstants.CMD_LAUNCH); - createButton(toolBar, Activator.IMG_BUTTON_STOP, Messages.LaunchBarControl_Stop, - ILaunchBarUIConstants.CMD_STOP); + Image imageLaunch = DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_LAUNCH_RUN); + createButton(buttons, imageLaunch, Messages.LaunchBarControl_Launch, ILaunchBarUIConstants.CMD_LAUNCH); + Image imageStop = DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_LAUNCH_RUN_TERMINATED); + createButton(buttons, imageStop, Messages.LaunchBarControl_Stop, ILaunchBarUIConstants.CMD_STOP); modeSelector = new ModeSelector(container, SWT.NONE); modeSelector.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); @@ -139,14 +143,9 @@ public class LaunchBarControl implements ILaunchBarListener { manager.removeListener(this); } - private ToolItem createButton(Composite parent, String imageName, String toolTipText, final String commandId) { - ToolItem button = new ToolItem((ToolBar) parent, SWT.FLAT); + private CLaunchButton createButton(Composite parent, Image image, String toolTipText, final String commandId) { + CLaunchButton button = new CLaunchButton(parent, SWT.NONE); - Image bgImage = Activator.getDefault().getImageRegistry().get(Activator.IMG_BUTTON_BACKGROUND); - Image fgImage = Activator.getDefault().getImageRegistry().get(imageName); - - ImageDescriptor imageDesc = new LaunchBarButtonImageDescriptor(fgImage, bgImage); - Image image = imageDesc.createImage(); button.setImage(image); button.setToolTipText(toolTipText); button.setData("command", commandId); //$NON-NLS-1$ @@ -167,7 +166,6 @@ public class LaunchBarControl implements ILaunchBarListener { } } }); - button.addDisposeListener(e -> image.dispose()); return button; } diff --git a/launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/ModeSelector.java b/launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/ModeSelector.java index d885b581456..41d84b3d886 100644 --- a/launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/ModeSelector.java +++ b/launchbar/org.eclipse.launchbar.ui.controls/src/org/eclipse/launchbar/ui/controls/internal/ModeSelector.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2014, 2018 QNX Software Systems and others. + * Copyright (c) 2014, 2022 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -34,13 +34,10 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.ToolBar; -import org.eclipse.swt.widgets.ToolItem; public class ModeSelector extends CSelector { private static final String[] noModes = new String[] { "---" }; //$NON-NLS-1$ private final ILaunchBarManager manager = Activator.getService(ILaunchBarManager.class); - private Map modeButtonImages = new HashMap<>(); public ModeSelector(Composite parent, int style) { super(parent, style); @@ -135,15 +132,6 @@ public class ModeSelector extends CSelector { }); } - @Override - public void dispose() { - super.dispose(); - - for (Image image : modeButtonImages.values()) { - image.dispose(); - } - } - protected ILaunchGroup getDefaultLaunchGroup(String mode) { String groupId; if (mode.equals(ILaunchManager.DEBUG_MODE)) { @@ -196,14 +184,15 @@ public class ModeSelector extends CSelector { updateLaunchButton(findLaunchButton()); } - private ToolItem findLaunchButton() { + private CLaunchButton findLaunchButton() { String commandId = ILaunchBarUIConstants.CMD_LAUNCH; + // Launchbar buttons are grouped in a composite that is a sibling to this for (Control control : getParent().getChildren()) { - if (control instanceof ToolBar) { - for (ToolItem toolItem : ((ToolBar) control).getItems()) { - if (commandId.equals(toolItem.getData("command"))) { //$NON-NLS-1$ + if (control instanceof Composite comp) { + for (Control button : comp.getChildren()) { + if (commandId.equals(button.getData("command"))) { //$NON-NLS-1$ // found launch button - return toolItem; + return (CLaunchButton) button; } } } @@ -212,27 +201,15 @@ public class ModeSelector extends CSelector { return null; } - private void updateLaunchButton(ToolItem toolItem) { - if (toolItem == null || isDisposed()) { + private void updateLaunchButton(CLaunchButton button) { + if (button == null || isDisposed()) { return; } Object selection = getSelection(); - if (selection instanceof ILaunchMode) { - ILaunchMode mode = (ILaunchMode) selection; - toolItem.setToolTipText(NLS.bind(Messages.ModeSelector_ToolTip, mode.getLabel())); - ILaunchGroup group = getLaunchGroup(mode); - // we cannot use mode id as id, since external tool group and run group have same "run" id for the mode - // but different images - String id = group.getIdentifier(); - Image image = modeButtonImages.get(id); - if (image == null) { - Image bgImage = Activator.getDefault().getImageRegistry().get(Activator.IMG_BUTTON_BACKGROUND); - Image modeImage = getLabelProvider().getImage(mode); - ImageDescriptor imageDesc = new LaunchBarButtonImageDescriptor(modeImage, bgImage); - image = imageDesc.createImage(); - modeButtonImages.put(id, image); - } - toolItem.setImage(image); + if (selection instanceof ILaunchMode mode) { + button.setToolTipText(NLS.bind(Messages.ModeSelector_ToolTip, mode.getLabel())); + Image image = getLabelProvider().getImage(mode); + button.setImage(image); } }