From b1639ebf66d85f57098c894529fc3be41fe42ae6 Mon Sep 17 00:00:00 2001 From: Taka Date: Thu, 9 May 2019 06:34:27 +0000 Subject: [PATCH] Changed the app icon, also included it in the About box. --- vasl_templates/about.py | 33 ++- vasl_templates/ui/about.ui | 225 ++++++++++--------- vasl_templates/webapp/config/constants.py | 1 + vasl_templates/webapp/static/images/app.ico | Bin 1758 -> 43646 bytes vasl_templates/webapp/static/images/app.snag | Bin 0 -> 24600 bytes 5 files changed, 148 insertions(+), 111 deletions(-) create mode 100644 vasl_templates/webapp/static/images/app.snag diff --git a/vasl_templates/about.py b/vasl_templates/about.py index a4e8de5..d3b941f 100644 --- a/vasl_templates/about.py +++ b/vasl_templates/about.py @@ -1,14 +1,18 @@ """Implement the "about" dialog.""" +import sys import os import json import time import io +import re -from PyQt5 import uic +from PyQt5 import uic, QtCore +from PyQt5.QtCore import QUrl +from PyQt5.QtGui import QDesktopServices, QIcon, QCursor from PyQt5.QtWidgets import QDialog -from vasl_templates.webapp.config.constants import APP_NAME, APP_VERSION, BASE_DIR +from vasl_templates.webapp.config.constants import APP_NAME, APP_VERSION, APP_HOME_URL, BASE_DIR, IS_FROZEN # --------------------------------------------------------------------- @@ -22,11 +26,21 @@ class AboutDialog( QDialog ): # initialize the UI base_dir = os.path.split( __file__ )[0] - dname = os.path.join( base_dir, "ui/about.ui" ) - uic.loadUi( dname, self ) + fname = os.path.join( base_dir, "ui/about.ui" ) + uic.loadUi( fname, self ) self.setFixedSize( self.size() ) self.close_button.clicked.connect( self.on_close ) + # initialize the UI + if IS_FROZEN: + dname = os.path.join( sys._MEIPASS, "vasl_templates/webapp" ) #pylint: disable=no-member,protected-access + else: + dname = os.path.join( os.path.split(__file__)[0], "webapp" ) + fname = os.path.join( dname, "static/images/app.ico" ) + self.app_icon.setPixmap( QIcon( fname ).pixmap(64,64) ) + self.app_icon.mouseReleaseEvent = self.on_app_icon_clicked + self.app_icon.setCursor( QCursor( QtCore.Qt.PointingHandCursor ) ) + # get the build info dname = os.path.join( BASE_DIR, "config" ) fname = os.path.join( dname, "build-info.json" ) @@ -53,9 +67,14 @@ class AboutDialog( QDialog ): self.build_info.setText( buf.getvalue() ) else: self.build_info.setText( "" ) - self.home_url.setText( - "Get the source code and releases from Github." - ) + mo = re.search( r"^https?://(.+)", APP_HOME_URL ) + self.home_url.setText( "Visit us at {}.".format( + APP_HOME_URL, mo.group(1) if mo else APP_HOME_URL + ) ) + + def on_app_icon_clicked( self, event ): #pylint: disable=no-self-use,unused-argument + """Click handler.""" + QDesktopServices.openUrl( QUrl( APP_HOME_URL ) ) def on_close( self ): """Close the dialog.""" diff --git a/vasl_templates/ui/about.ui b/vasl_templates/ui/about.ui index ed9fd2d..e62debd 100644 --- a/vasl_templates/ui/about.ui +++ b/vasl_templates/ui/about.ui @@ -9,8 +9,8 @@ 0 0 - 428 - 142 + 410 + 150 @@ -19,113 +19,130 @@ true - - - - - - DejaVu Sans - 12 - - - - *** APP NAME *** - - - - - - - *** BUILD INFO *** - - - - - - - *** HOME URL *** - - - true - - - - - - - Licensed under the GNU Affero General Public License (v3). - - - - - - - - 0 - 0 - - - - - 0 - 30 - - - - - 16777215 - 30 - - - - - 5 + + + + 10 + 10 + 64 + 64 + + + + QFrame::NoFrame + + + + + + + + + 80 + 20 + 321 + 44 + + + + + + + + DejaVu Sans + 12 + - - 0 + + *** APP NAME *** - - 0 + + + + + + + DejaVu Sans + true + - - 0 + + *** BUILD INFO *** - - 0 + + + + + + + + 10 + 110 + 391 + 31 + + + + + + + Qt::Horizontal - - - - Qt::Horizontal - - - - 309 - 20 - - - - - - - - - 0 - 0 - - - - Close - - - true - - - - - - - + + + 309 + 20 + + + + + + + + + 0 + 0 + + + + Close + + + true + + + + + + + + + 10 + 100 + 391 + 17 + + + + *** HOME URL *** + + + true + + + + + + 10 + 80 + 388 + 17 + + + + Licensed under the GNU Affero General Public License (v3). + + diff --git a/vasl_templates/webapp/config/constants.py b/vasl_templates/webapp/config/constants.py index c92492a..5a227fe 100644 --- a/vasl_templates/webapp/config/constants.py +++ b/vasl_templates/webapp/config/constants.py @@ -6,6 +6,7 @@ import os APP_NAME = "VASL Templates" APP_VERSION = "v0.10" # nb: also update setup.py APP_DESCRIPTION = "Generate HTML for use in VASL scenarios." +APP_HOME_URL = "https://vasl-templates.org" if getattr( sys, "frozen", False ): IS_FROZEN = True diff --git a/vasl_templates/webapp/static/images/app.ico b/vasl_templates/webapp/static/images/app.ico index 2333135901bcc2cb2baad3ff5766f9daeb5d12f3..2e2375973ce54fe8cfb548933dad01985cb2442f 100644 GIT binary patch literal 43646 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ΝdU930(hAK8&-v}w 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