From 90451e6da933453d77e6015f779542d07fe27612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E4=B8=B4=E9=A3=8E?= Date: Wed, 24 Aug 2016 13:46:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=80=E5=A4=A7=E9=99=90=E5=BA=A6=E7=9A=84?= =?UTF-8?q?=E6=8D=95=E8=8E=B7=E5=BC=82=E5=B8=B8=EF=BC=8C=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=B4=A9=E6=BA=83=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=85=B3=E9=97=AD=E6=8E=A8=E8=8D=90=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../download/DynamicDownloadProvider.java | 5 +- .../launcher/setting/Config.java | 12 ++ .../launcher/ui/RecommendPanel.java | 121 ++++++++++++++---- .../launcher/util/CrashReporter.java | 4 +- .../hellominecraft/launcher/re_close.png | Bin 0 -> 1182 bytes .../launcher/re_close_enter.png | Bin 0 -> 1117 bytes 6 files changed, 111 insertions(+), 31 deletions(-) create mode 100644 HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close.png create mode 100644 HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close_enter.png diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java index e0eacfcdc..8cbe9dbf1 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DynamicDownloadProvider.java @@ -144,8 +144,7 @@ public class DynamicDownloadProvider extends MojangDownloadProvider { try { String providerInfo = NetUtils.get(PROVIDER_ADDR); Map addrInfo = null; - addrInfo = C.GSON.fromJson(providerInfo, new TypeToken>() { - }.getType()); + addrInfo = C.GSON.fromJson(providerInfo, new TypeToken>() {}.getType()); if (addrInfo != null) { setLibrariesAddr(getValue(addrInfo, "libraries")); setAssetsAddr(getValue(addrInfo, "assets")); @@ -153,7 +152,7 @@ public class DynamicDownloadProvider extends MojangDownloadProvider { setLauncherAddr(getValue(addrInfo, "launcher")); setVersionManifestAddr(getValue(addrInfo, "versionManifest")); } - } catch (IOException ex) { + } catch (Throwable t) { } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java index 8b8ee10b7..53a215aad 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java @@ -21,8 +21,10 @@ import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; import com.google.gson.annotations.SerializedName; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; import java.util.UUID; import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator; @@ -76,6 +78,16 @@ public final class Config implements Cloneable { private Map auth; @SerializedName("ignoreUpdateVersion") private String ignoreUpdateVersion; + @SerializedName("ignoreRecommend") + private Set ignoreRecommend; + + public Set getIgnoreRecommend() { + if (ignoreRecommend == null) { + ignoreRecommend = new HashSet<>(); + Settings.save(); + } + return ignoreRecommend; + } public List getJava() { return java == null ? java = new ArrayList<>() : java; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java index 9c3bb26a4..1c19c2f14 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/RecommendPanel.java @@ -36,9 +36,15 @@ import java.util.ArrayList; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JButton; import javax.swing.SwingUtilities; +import org.jackhuang.hellominecraft.launcher.Main; +import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.NetUtils; +import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.util.ui.SwingUtils; /** @@ -49,12 +55,21 @@ public class RecommendPanel extends JPanel { private static final int SWITCH_INTERVAL = 10; + private static final int SPACE = 10; + private static final int TOP_POSITION = 2; + + private JButton closeButton; + private Image currImage; private String imageKey = null; + private boolean ignoreSwitch = false; private List recommends; + public ScheduledExecutorService scheduledexec = Executors.newScheduledThreadPool(1); public RecommendPanel() { + initComponents(); + recommends = new ArrayList(); new LoadImages().execute(); setCursor(new Cursor(Cursor.HAND_CURSOR)); @@ -67,6 +82,31 @@ public class RecommendPanel extends JPanel { }); } + private void initComponents() { + this.setLayout(null); + + closeButton = new JButton(Main.getIcon("re_close.png")); + closeButton.setRolloverIcon(Main.getIcon("re_close_enter.png")); + closeButton.setBorder(BorderFactory.createEmptyBorder()); + closeButton.setContentAreaFilled(false); + closeButton.addActionListener((e) -> { + synchronized(RecommendPanel.class) { + if (StrUtils.isNotBlank(imageKey)) { + Settings.getInstance().getIgnoreRecommend().add(imageKey); + Settings.save(); + + ignoreSwitch = true; + showNext(); + } + } + }); + closeButton.setCursor(new Cursor(Cursor.HAND_CURSOR)); + closeButton.setFocusable(false); + closeButton.setBounds(0, 0, 12, 12); + closeButton.setVisible(false); + this.add(closeButton); + } + private void MouseClicked(MouseEvent evt) { if (imageKey == null) { return; @@ -86,13 +126,14 @@ public class RecommendPanel extends JPanel { @Override public void run() { for (RecommendInfo info : recommends) { - try { - File tempFile = File.createTempFile("hmcl", "png"); - String tempPath = tempFile.getCanonicalPath(); - if (NetUtils.download(info.url, tempPath)) { - info.image = ImageIO.read(tempFile); - } - } catch (IOException ex) { + if (!ignoreShowUrl(info.url)) { + try { + File tempFile = File.createTempFile("hmcl", "png"); + String tempPath = tempFile.getCanonicalPath(); + if (NetUtils.download(info.url, tempPath)) { + info.image = ImageIO.read(tempFile); + } + } catch (Throwable t) { } } } @@ -105,9 +146,13 @@ public class RecommendPanel extends JPanel { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - int showIndex = getNextImageIndex(); - RecommendInfo info = recommends.get(showIndex); - RecommendPanel.this.setImage(info.url, info.image); + synchronized(RecommendPanel.class) { + if (ignoreSwitch) { + ignoreSwitch = false; + } else { + showNext(); + } + } } }); } @@ -142,25 +187,45 @@ public class RecommendPanel extends JPanel { } return true; } + + private void showNext() { + if (getCanShowImageCount() == 0) { + setVisible(false); + } else { + int showIndex = getNextImageIndex(); + RecommendInfo info = recommends.get(showIndex); + setImage(info.url, info.image); + } + } + + private boolean ignoreShowUrl(String url) { + return Settings.getInstance().getIgnoreRecommend().contains(url); + } + public int getCanShowImageCount() { + int imageCount = 0; + for (RecommendInfo recommend : recommends) { + if (recommend.image != null && !ignoreShowUrl(recommend.url)) { + imageCount++; + } + } + return imageCount; + } + public int getNextImageIndex(int showIndex) { if (showIndex >= recommends.size()) { showIndex = 0; } RecommendInfo info = recommends.get(showIndex); - if (info.image == null) { - showIndex = getNextImageIndex(++showIndex); + if (info.image == null || ignoreShowUrl(info.url)) { + showIndex = getNextImageIndex(++showIndex); } return showIndex; } public int getNextImageIndex() { - int showIndex = 0; - if (imageKey != null) { - showIndex = getCurrentImageIndex(); - showIndex++; - } - if (showIndex >= recommends.size()) { + int showIndex = getCurrentImageIndex(); + if (++showIndex >= recommends.size()) { showIndex = 0; } showIndex = getNextImageIndex(showIndex); @@ -178,21 +243,26 @@ public class RecommendPanel extends JPanel { } return currIndex; } - + public void setImage(String key, Image image) { this.imageKey = key; this.currImage = image; - //setToolTipText(C.i18n("ui.message.recommend_tip")); - setSize(image.getWidth(this), image.getHeight(this)); + + int btnWidth = closeButton.getWidth(); + + setSize(image.getWidth(this) + SPACE + btnWidth, image.getHeight(this)); + closeButton.setLocation(getWidth() - btnWidth, TOP_POSITION); + closeButton.setVisible(true); + SwingUtilities.updateComponentTreeUI(this.getRootPane()); } @Override public void paintComponent(Graphics g) { - if (null == currImage) { - return; + if (currImage != null) { + g.drawImage(currImage, 0, 0, currImage.getWidth(this), currImage.getHeight(this), this); } - g.drawImage(currImage, 0, 0, currImage.getWidth(this), currImage.getHeight(this), this); + super.paintComponent(g); } static class RecommendInfo { @@ -215,8 +285,7 @@ public class RecommendPanel extends JPanel { } Map data = new Gson().fromJson(content, - new TypeToken>() { - }.getType()); + new TypeToken>() {}.getType()); if (data == null) { break; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java index ba507757d..9ff47c0aa 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java @@ -139,8 +139,8 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { map.put("CrashReport", text); try { NetUtils.post(NetUtils.constantURL("http://huangyuhui.duapp.com/crash.php"), map); - } catch (IOException ex) { - LOGGER.log(Level.SEVERE, "Failed to post HMCL server.", ex); + } catch (Throwable error) { + LOGGER.log(Level.SEVERE, "Failed to post HMCL server.", error); } }); t.setDaemon(true); diff --git a/HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close.png b/HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/re_close.png new file mode 100644 index 0000000000000000000000000000000000000000..c006673dcc2267c7a5ff3bf29d99688638ab616a GIT binary patch literal 1182 zcmbVMU2M}<6gH~px@v$XApz5*U5xmtw8VB|JF%Cn*l|oVNU73jWExWE+PAG~?CaS# z#I4x)lLj4{ShWY>X%FzQY0`w$$D(x-LKBnLzU-G5wlWEA6c`LN73jL_w(0gz@i5Ew z{qgy}@0@eb@km$at~ISMv{DqcrqH34$oO3Jv^10V>$Uwi$*>9ME4Ul=;kw~NO0iHc z1O>iaE%$fsTT+p&K`4YEmOBR%*#PeE?7n8ZX$Z@Kc;`3=e znM+G4A(zq{94lcZB`<2M!itiT;<&sh30hv)m6W2Xd`jo|2Dab^*ln|a@``>vCnobR1eys<5`SWgT8$bTDp%Mu#jKbUO}Hv zE3BI2bwv=RDDJe7PUHnuWmPF9Nvc9GVXgm@Gln?BM8)x+VrguV3XG=9rB4>i%>!N1 zF+ORH^~sT2q^%|knoubBc>gee7rRM3eF>a2U sJ$mlky{~REhkxFDrQ^@D%`Gf-z7V#i~bmee5dxg`qr_30QN%Te*v-}*t*zE%U2}yljx$G{Z03wJXWLmL zrFsY<=mwEc>Qg-gLD5q;DZ9TFQel=*kkLa@LRpb^MqTTnZJ3#J;rqV-KmY%o&Z^2y zu0@55D2j4LH;ZvHE_S~BJo4X>+Brgo<+wbFt5G9POD3ek3Tl8Ls!2^S4kabi`WOZ& zY96g7k~kULCdf$hNDjthYX)IcRIt=GB)J7*&;XlMJw%V*=%azEgy`Bp%o{Tzuvy*Q zX2R;W%7on3BJ&Dex&Z`jfe2_2OTgCl>6T!J=qX)+%$;q922&8+5~8P*O2(={1ep*7 zJbt(AWm&*+9=15ZaqK$a^Rhn1OJ2^+77GDR@Rfj>hbGZXrBR5B6*IBODnvJ9YzPdK zPNzL-zXzF349oMpqv7+p3BqkhZahiGHG1nDkqd7L`*1Q zWF`>Wm#tz|Gs4JfMh1vfb6`!asw*gMt)0ThVnS56u%yc{Du!sH;89gY@QdN%3O~nk zd>N^FImdGxzrMuJM~e9}F1+5C<%&p7X;8;muJVWL%gJ@Dpcy2x2u*cAR4PoQfvF=4 zYR+5&6*={0xJvF^yg9iHNrrJ6`&Xm0Tf{xibk??HF>8FN6Steh)*n|KI7zO=)2J9u z*n*~7dI+v_I@e{7j)Ku=aTgS&<3>SslsqYIeBd$t zx%2wx_rlA}kGBt!0mHgtzP>#<@$A;ap6(;#rR@{HTwnS}`zAZa#;&&B8DO6UFU*;{ Ym|7Uzdau7XKi|3V(eg_1a#{W1-%==kv;Y7A literal 0 HcmV?d00001