diff --git a/launcher_model.pyc b/launcher_model.pyc deleted file mode 100644 index 6383f00..0000000 Binary files a/launcher_model.pyc and /dev/null differ diff --git a/pylauncher/__init__.py b/pylauncher/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/config/config.json b/pylauncher/config/config.json similarity index 96% rename from config/config.json rename to pylauncher/config/config.json index e2acef1..e6006e4 100644 --- a/config/config.json +++ b/pylauncher/config/config.json @@ -1,6 +1,6 @@ { "Linux": { - "theme_base": "./qss/", + "theme_base": "../qss", "cmd": { "command": "" }, diff --git a/launcher.py b/pylauncher/launcher.py similarity index 96% rename from launcher.py rename to pylauncher/launcher.py index f7b7959..45a0224 100755 --- a/launcher.py +++ b/pylauncher/launcher.py @@ -9,6 +9,8 @@ import json import copy import enum import urllib2 +import urlparse +import logging from PyQt4 import QtGui, QtCore from PyQt4.QtCore import pyqtSlot, Qt @@ -38,9 +40,10 @@ class LauncherWindow(QtGui.QMainWindow): try: cfgFile = open_launcher_file(cfgFilePath) except IOError: - errMsg = "Err: Configuration file \"" + cfgFilePath + \ + errMsg = "Configuration file \"" + cfgFilePath + \ "\" not found." - sys.exit(errMsg) + logging.error(errMsg) + sys.exit() cfg = json.load(cfgFile) cfgFile.close() # Get configuration for current system. platform.system() returns: @@ -57,6 +60,8 @@ class LauncherWindow(QtGui.QMainWindow): path_tuple = os.path.split(rootFilePath) self.launcherCfg["launcher_base"] = path_tuple[0] rootFilePath = path_tuple[1] + # Get defined theme base. If it is not url or absolute dir, make it + # relative to config file. self.menuModel = self.buildMenuModel(rootFilePath) self.setWindowTitle(self.menuModel.mainTitle) @@ -122,8 +127,9 @@ class LauncherWindow(QtGui.QMainWindow): try: rootMenuFile = open_launcher_file(rootMeniFullPath) except IOError: - errMsg = "Err: File \"" + rootMenuPath + "\" not found." - sys.exit(errMsg) + errMsg = "File \"" + rootMenuPath + "\" not found." + logging.error(errMsg) + sys.exit() rootMenu = launcher_menu_model(None, rootMenuFile, 0, self.launcherCfg) rootMenuFile.close() return rootMenu @@ -445,6 +451,7 @@ class LauncherSearchMenuView(LauncherMenu): addPrefix = True elif item.__class__.__name__ == "launcher_sub_menu_item": # Take subemnu model and build (visualize) it below + cSubMenuItems = copy.copy(item.sub_menu.menu_items) cMenuItems.extend(cSubMenuItems) elif item.__class__.__name__ == "launcher_title_item": @@ -982,11 +989,17 @@ class LauncherStyle: def appendThemeStyle(self, theme): mainWindow = self.item.parent().getLauncherWindow() - theme_file = open_launcher_file( - mainWindow.launcherCfg.get("theme_base") + theme + ".qss") - self.styleString = self.styleString + theme_file.read() - theme_file.close() - self.style = QtCore.QLatin1String(self.styleString) + try: + theme_file = open_launcher_file( + os.path.join(mainWindow.launcherCfg.get("theme_base"), + theme + ".qss")) + self.styleString = self.styleString + theme_file.read() + theme_file.close() + self.style = QtCore.QLatin1String(self.styleString) + except IOError: + warnMsg = "Theme \"" + theme + \ + "\" was not found. Theme ignored." + logging.warning(warnMsg) def appendStyle(self, style, item): self.styleString = self.styleString + item.__class__.__name__ +\ @@ -997,8 +1010,8 @@ class LauncherStyle: self.styleString = self.styleString + style self.style = QtCore.QLatin1String(self.styleString) -if __name__ == '__main__': +def main(): # Usage: launcher.py menu config argsPars = argparse.ArgumentParser() argsPars.add_argument('config', @@ -1014,8 +1027,9 @@ if __name__ == '__main__': app.setStyle("cleanlooks") currDir = os.path.dirname(os.path.realpath(__file__)) + print currDir styleFile = open_launcher_file(os.path.join(currDir, - "res/qss/default.qss")) + "res/qss/default.qss")) app.setStyleSheet(styleFile.read()) styleFile.close() launcherWindow = LauncherWindow(args.launcher, args.config) @@ -1025,9 +1039,13 @@ if __name__ == '__main__': launcherWindow.setStyleSheet(userStyle.read()) userStyle.close() except IOError: - errMsg = "Err: Style file \"" + args.style + "\" not found." - sys.exit(errMsg) + errMsg = "Style file \"" + args.style + "\" not found." + logging.error(errMsg) + sys.exit() launcherWindow.setGeometry(0, 0, 150, 0) launcherWindow.show() sys.exit(app.exec_()) + +if __name__ == '__main__': + main() diff --git a/pylauncher/launcher.pyc b/pylauncher/launcher.pyc new file mode 100644 index 0000000..3f4e7d8 Binary files /dev/null and b/pylauncher/launcher.pyc differ diff --git a/launcher_model.py b/pylauncher/launcher_model.py similarity index 93% rename from launcher_model.py rename to pylauncher/launcher_model.py index 046787c..e6179c4 100644 --- a/launcher_model.py +++ b/pylauncher/launcher_model.py @@ -75,17 +75,18 @@ class launcher_menu_model: text, file_name)) except IOError: - err_msg = "ParseErr: " + menu_file.geturl() + ": File \"" +\ - file_name + "\" not found." - logging.warning(err_msg) + warn_msg = "Parser: " + menu_file.geturl() + ": File \"" +\ + file_name + "\" not found. Skipped" + logging.warning(warn_msg) # Build menu model. Report error if menu is not defined. list_of_menu_items = menu.get("menu", list()) if not list_of_menu_items: - err_msg = "ParseErr: " + menu_file.geturl() +\ - ": Launcher menu is not defined." - sys.exit(err_msg) + err_msg = "Parser: " + menu_file.geturl() +\ + ": Launcher menu is empty." + logging.error(err_msg) + sys.exit() for item in list_of_menu_items: menu_item = None @@ -140,9 +141,9 @@ class launcher_menu_model: None) sub_file.close() except IOError: - err_msg = "ParseErr: " + menu_file.geturl() + \ - ": File \"" + file_name + "\" not found." - logging.warning(err_msg) + warn_msg = "Parser: " + menu_file.geturl() + \ + ": File \"" + file_name + "\" not found. Skipped" + logging.warning(warn_msg) elif item_type == "title": self.check_item_format_json(item, ["text"]) @@ -153,9 +154,9 @@ class launcher_menu_model: menu_item = launcher_item_separator(self, theme, style) else: - err_msg = "ParseErr:" + menu_file.geturl() + \ - ": Unknown type \"" + item_type + "\"." - logging.warning(err_msg) + warn_msg = "Parser:" + menu_file.geturl() + \ + ": Unknown type \"" + item_type + "\". Skipped" + logging.warning(warn_msg) if menu_item != None: self.menu_items.append(menu_item) @@ -169,9 +170,10 @@ class launcher_menu_model: for param in mandatory_param: if not item.get(param): - err_msg = "ParseErr: Parameter \"" + param + \ + err_msg = "Parser Parameter \"" + param + \ "\" is mandatory in configuration \"" + item + "\"." - sys.exit(err_msg) + logging.error(err_msg) + sys.exit() class launcher_menu_model_item: diff --git a/pylauncher/launcher_model.pyc b/pylauncher/launcher_model.pyc new file mode 100644 index 0000000..cb69520 Binary files /dev/null and b/pylauncher/launcher_model.pyc differ diff --git a/menus/menu_1.json b/pylauncher/menus/menu_1.json similarity index 100% rename from menus/menu_1.json rename to pylauncher/menus/menu_1.json diff --git a/menus/menu_2.json b/pylauncher/menus/menu_2.json similarity index 100% rename from menus/menu_2.json rename to pylauncher/menus/menu_2.json diff --git a/menus/menu_3.json b/pylauncher/menus/menu_3.json similarity index 100% rename from menus/menu_3.json rename to pylauncher/menus/menu_3.json diff --git a/qss/green.qss b/pylauncher/qss/green.qss similarity index 100% rename from qss/green.qss rename to pylauncher/qss/green.qss diff --git a/res/images/caret-right.png b/pylauncher/res/images/caret-right.png similarity index 100% rename from res/images/caret-right.png rename to pylauncher/res/images/caret-right.png diff --git a/res/images/delete-2x.png b/pylauncher/res/images/delete-2x.png similarity index 100% rename from res/images/delete-2x.png rename to pylauncher/res/images/delete-2x.png diff --git a/res/images/magnifying-glass-2x.png b/pylauncher/res/images/magnifying-glass-2x.png similarity index 100% rename from res/images/magnifying-glass-2x.png rename to pylauncher/res/images/magnifying-glass-2x.png diff --git a/res/qss/default.qss b/pylauncher/res/qss/default.qss similarity index 100% rename from res/qss/default.qss rename to pylauncher/res/qss/default.qss diff --git a/pylauncher/run.pyc b/pylauncher/run.pyc new file mode 100644 index 0000000..143250c Binary files /dev/null and b/pylauncher/run.pyc differ diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 index 349215c..91505cb --- a/setup.py +++ b/setup.py @@ -6,28 +6,26 @@ from setuptools import setup, find_packages here = os.path.abspath(os.path.dirname(__file__)) README = open(os.path.join(here, 'Readme.md')).read() -version = '1.0.00' setup(name='pylauncher', - version=version, + version='1.0.00', description="Standard PSI tool for accessing GUIs", long_description=README, + author='PSI', + url='https://github.psi.ch/projects/COS/repos/pylauncher/browse', + licence='GPLv3+', + keywords='launcher, caqtdm, medm, PSI', classifiers=[ # Get strings from # http://pypi.python.org/pypi?%3Aaction=list_classifiers 'Development Status :: 3 - Alpha', 'Environment :: Console', 'Intended Audience :: Developers', - 'Programming Language :: Python', 'Programming Language :: Python :: 2', - 'Topic :: Software Development :: Libraries :: Python Modules', - 'Topic :: Software Development :: Testing', - 'Topic :: Utilities', - 'License :: OSI Approved :: MIT License' + 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)' ], - keywords='launcher, caqtdm, medm, PSI', - author='PSI', - url='https://github.psi.ch/projects/COS/repos/pylauncher/browse', - license='MIT License', - packages=find_packages(exclude=['*.tests']), + #packages=find_packages(exclude=['*.tests']), + packages=['pylauncher'], + package_dir={'pylauncher': 'pylauncher'}, + package_data={'pylauncher': ['res/images/*.png', 'res/qss/*.qss']}, platforms=["any"], ) diff --git a/utils/__inti__.py b/utils/__inti__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/conda_package/pylauncher/bld.bat b/utils/conda_package/pylauncher/bld.bat new file mode 100644 index 0000000..6021130 --- /dev/null +++ b/utils/conda_package/pylauncher/bld.bat @@ -0,0 +1,2 @@ +"%PYTHON%" setup.py install +if errorlevel 1 exit 1 \ No newline at end of file diff --git a/utils/conda_package/pylauncher/build.sh b/utils/conda_package/pylauncher/build.sh new file mode 100644 index 0000000..31dc669 --- /dev/null +++ b/utils/conda_package/pylauncher/build.sh @@ -0,0 +1 @@ +$PYTHON setup.py install # Python command to install the script \ No newline at end of file diff --git a/utils/conda_package/pylauncher/meta.yaml b/utils/conda_package/pylauncher/meta.yaml new file mode 100644 index 0000000..651a126 --- /dev/null +++ b/utils/conda_package/pylauncher/meta.yaml @@ -0,0 +1,20 @@ +package: + name: pylauncher + version: 1.0.0 +source: + git_url: file:///home/rvintar/workspace/CSL/launcher_req/git/pylauncher +build: + entry_points: + - pylauncher = pylauncher.launcher:main +requirements: + build: + - python + - setuptools + - pyqt + run: + - python + - pyqt +about: + home: https://github.psi.ch/projects/COS/repos/pylauncher/browse + license: MIT + summary: "Standard PSI launcher application." \ No newline at end of file