[Bf-extensions-cvs] [2532b968] master: Magic UV: Release v5.2

Nutti noreply at git.blender.org
Sat Nov 17 13:14:22 CET 2018


Commit: 2532b96844c121b710e1a1973d2a5ff824ab3be4
Author: Nutti
Date:   Sat Nov 17 21:11:55 2018 +0900
Branches: master
https://developer.blender.org/rBA2532b96844c121b710e1a1973d2a5ff824ab3be4

Magic UV: Release v5.2

* Bulit-in menu preferences
* Add-on updater

* Copy/Paste UV
  * Add option "[New]" for pasting to newly allocated UV map
  * Add option "[All]" for pasting all UV maps at once
* Align UV
  * Add option "Mesh Influence"
* World Scale UV
  * Add mode option "Manual" to allow the user specify the density manually

* Improve UI
* Cleanup documents
* Fix bugs

===================================================================

M	uv_magic_uv/__init__.py
A	uv_magic_uv/addon_updater.py
A	uv_magic_uv/addon_updater_ops.py
M	uv_magic_uv/common.py
M	uv_magic_uv/op/__init__.py
M	uv_magic_uv/op/align_uv.py
M	uv_magic_uv/op/align_uv_cursor.py
M	uv_magic_uv/op/copy_paste_uv.py
M	uv_magic_uv/op/copy_paste_uv_object.py
M	uv_magic_uv/op/copy_paste_uv_uvedit.py
M	uv_magic_uv/op/flip_rotate_uv.py
M	uv_magic_uv/op/mirror_uv.py
M	uv_magic_uv/op/move_uv.py
M	uv_magic_uv/op/pack_uv.py
M	uv_magic_uv/op/preserve_uv_aspect.py
A	uv_magic_uv/op/select_uv.py
M	uv_magic_uv/op/smooth_uv.py
M	uv_magic_uv/op/texture_lock.py
M	uv_magic_uv/op/texture_projection.py
M	uv_magic_uv/op/texture_wrap.py
M	uv_magic_uv/op/transfer_uv.py
M	uv_magic_uv/op/unwrap_constraint.py
M	uv_magic_uv/op/uv_bounding_box.py
M	uv_magic_uv/op/uv_inspection.py
M	uv_magic_uv/op/uv_sculpt.py
M	uv_magic_uv/op/uvw.py
M	uv_magic_uv/op/world_scale_uv.py
M	uv_magic_uv/preferences.py
M	uv_magic_uv/properites.py
A	uv_magic_uv/ui/IMAGE_MT_uvs.py
A	uv_magic_uv/ui/VIEW3D_MT_object.py
A	uv_magic_uv/ui/VIEW3D_MT_uv_map.py
M	uv_magic_uv/ui/__init__.py
M	uv_magic_uv/ui/uvedit_copy_paste_uv.py
D	uv_magic_uv/ui/uvedit_editor_enhance.py
A	uv_magic_uv/ui/uvedit_editor_enhancement.py
M	uv_magic_uv/ui/uvedit_uv_manipulation.py
M	uv_magic_uv/ui/view3d_copy_paste_uv_editmode.py
M	uv_magic_uv/ui/view3d_copy_paste_uv_objectmode.py
M	uv_magic_uv/ui/view3d_uv_manipulation.py
M	uv_magic_uv/ui/view3d_uv_mapping.py

===================================================================

diff --git a/uv_magic_uv/__init__.py b/uv_magic_uv/__init__.py
index 080d2414..20709e79 100644
--- a/uv_magic_uv/__init__.py
+++ b/uv_magic_uv/__init__.py
@@ -20,15 +20,15 @@
 
 __author__ = "Nutti <nutti.metro at gmail.com>"
 __status__ = "production"
-__version__ = "5.1"
-__date__ = "24 Feb 2018"
+__version__ = "5.2"
+__date__ = "17 Nov 2018"
 
 
 bl_info = {
     "name": "Magic UV",
     "author": "Nutti, Mifth, Jace Priester, kgeogeo, mem, imdjs"
               "Keith (Wahooney) Boshoff, McBuff, MaxRobinot, Alexander Milovsky",
-    "version": (5, 1, 0),
+    "version": (5, 2, 0),
     "blender": (2, 79, 0),
     "location": "See Add-ons Preferences",
     "description": "UV Toolset. See Add-ons Preferences for details",
@@ -47,24 +47,36 @@ if "bpy" in locals():
     importlib.reload(common)
     importlib.reload(preferences)
     importlib.reload(properites)
+    importlib.reload(addon_updater_ops)
+    importlib.reload(addon_updater)
 else:
     from . import op
     from . import ui
     from . import common
     from . import preferences
     from . import properites
+    from . import addon_updater_ops
+    from . import addon_updater
 
 import bpy
 
 
 def register():
-    bpy.utils.register_module(__name__)
+    if not common.is_console_mode():
+        addon_updater_ops.register(bl_info)
     properites.init_props(bpy.types.Scene)
+    bpy.utils.register_module(__name__)
+    if preferences.Preferences.enable_builtin_menu:
+        preferences.add_builtin_menu()
 
 
 def unregister():
+    if preferences.Preferences.enable_builtin_menu:
+        preferences.remove_builtin_menu()
     bpy.utils.unregister_module(__name__)
     properites.clear_props(bpy.types.Scene)
+    if not common.is_console_mode():
+        addon_updater_ops.unregister()
 
 
 if __name__ == "__main__":
diff --git a/uv_magic_uv/addon_updater.py b/uv_magic_uv/addon_updater.py
new file mode 100644
index 00000000..70b6a287
--- /dev/null
+++ b/uv_magic_uv/addon_updater.py
@@ -0,0 +1,1501 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+
+"""
+See documentation for usage
+https://github.com/CGCookie/blender-addon-updater
+
+"""
+
+import ssl
+import urllib.request
+import urllib
+import os
+import json
+import zipfile
+import shutil
+import asyncio
+import threading
+import time
+import fnmatch
+from datetime import datetime, timedelta
+
+# blender imports, used in limited cases
+import bpy
+import addon_utils
+
+# -----------------------------------------------------------------------------
+# Define error messages/notices & hard coded globals
+# -----------------------------------------------------------------------------
+
+# currently not used
+DEFAULT_TIMEOUT = 10
+DEFAULT_PER_PAGE = 30
+
+
+# -----------------------------------------------------------------------------
+# The main class
+# -----------------------------------------------------------------------------
+
+class Singleton_updater(object):
+	"""
+	This is the singleton class to reference a copy from,
+	it is the shared module level class
+	"""
+	def __init__(self):
+
+		self._engine = GithubEngine()
+		self._user = None
+		self._repo = None
+		self._website = None
+		self._current_version = None
+		self._subfolder_path = None
+		self._tags = []
+		self._tag_latest = None
+		self._tag_names = []
+		self._latest_release = None
+		self._use_releases = False
+		self._include_branches = False
+		self._include_branch_list = ['master']
+		self._include_branch_autocheck = False
+		self._manual_only = False
+		self._version_min_update = None
+		self._version_max_update = None
+
+		# by default, backup current addon if new is being loaded
+		self._backup_current = True
+		self._backup_ignore_patterns = None
+
+		# set patterns for what files to overwrite on update
+		self._overwrite_patterns = ["*.py","*.pyc"]
+		self._remove_pre_update_patterns = []
+
+		# by default, don't auto enable/disable the addon on update
+		# as it is slightly less stable/won't always fully reload module
+		self._auto_reload_post_update = False
+
+		# settings relating to frequency and whether to enable auto background check
+		self._check_interval_enable = False
+		self._check_interval_months = 0
+		self._check_interval_days = 7
+		self._check_interval_hours = 0
+		self._check_interval_minutes = 0
+
+		# runtime variables, initial conditions
+		self._verbose = False
+		self._fake_install = False
+		self._async_checking = False  # only true when async daemon started
+		self._update_ready = None
+		self._update_link = None
+		self._update_version = None
+		self._source_zip = None
+		self._check_thread = None
+		self.skip_tag = None
+		self.select_link = None
+
+		# get from module data
+		self._addon = __package__.lower()
+		self._addon_package = __package__  # must not change
+		self._updater_path = os.path.join(os.path.dirname(__file__),
+										self._addon+"_updater")
+		self._addon_root = os.path.dirname(__file__)
+		self._json = {}
+		self._error = None
+		self._error_msg = None
+		self._prefiltered_tag_count = 0
+
+		# UI code only, ie not used within this module but still useful
+		# properties to have
+
+		# to verify a valid import, in place of placeholder import
+		self.showpopups = True # used in UI to show or not show update popups
+		self.invalidupdater = False
+
+
+	# -------------------------------------------------------------------------
+	# Getters and setters
+	# -------------------------------------------------------------------------
+
+	@property
+	def engine(self):
+		return self._engine.name
+	@engine.setter
+	def engine(self, value):
+		if value.lower()=="github":
+			self._engine = GithubEngine()
+		elif value.lower()=="gitlab":
+			self._engine = GitlabEngine()
+		elif value.lower()=="bitbucket":
+			self._engine = BitbucketEngine()
+		else:
+			raise ValueError("Invalid engine selection")
+
+	@property
+	def private_token(self):
+		return self._engine.token
+	@private_token.setter
+	def private_token(self, value):
+		if value==None:
+			self._engine.token = None
+		else:
+			self._engine.token = str(value)
+
+	@property
+	def addon(self):
+		return self._addon
+	@addon.setter
+	def addon(self, value):
+		self._addon = str(value)
+
+	@property
+	def verbose(self):
+		return self._verbose
+	@verbose.setter
+	def verbose(self, value):
+		try:
+			self._verbose = bool(value)
+			if self._verbose == True:
+				print(self._addon+" updater verbose is enabled")
+		except:
+			raise ValueError("Verbose must be a boolean value")
+
+	@property
+	def include_branches(self):
+		return self._include_branches
+	@include_branches.setter
+	def include_branches(self, value):
+		try:
+			self._include_branches = bool(value)
+		except:
+			raise ValueError("include_branches must be a boolean value")
+
+	@property
+	def use_releases(self):
+		return self._use_releases
+	@use_releases.setter
+	def use_releases(self, value):
+		try:
+			self._use_releases = bool(value)
+		except:
+			raise ValueError("use_releases must be a boolean value")
+
+	@property
+	def include_branch_list(self):
+		return self._include_branch_list
+	@include_branch_list.setter
+	def include_branch_list(self, value):
+		try:
+			if value == None:
+				self._include_branch_list = ['master']
+			elif type(value) != type(['master']) or value==[]:
+				raise ValueError("include_branch_list should be a list of valid branches")
+			else:
+				self._include_branch_list = value
+		except:
+			raise ValueError("include_branch_list should be a list of valid branches")
+
+	@property
+	def overwrite_patterns(self):
+		return self._overwrite_patterns
+	@overwrite_patterns.setter
+	def overwrite_patterns(self, value):
+		if value == None:
+			self._overwrite_patterns = ["*.py","*.pyc"]
+		elif type(value) != type(['']):
+			raise ValueError("overwrite_patterns needs to be in a list format")
+		else:
+			self._overwrite_patterns = value
+
+	@property
+	def remove_pre_update_patterns(self):
+		return self._remove_pre_update_patterns
+	@remove_pre_update_patterns.setter
+	def remove_pre_update_patterns(self, value):
+		if value == None:
+			self._remove_pre_update_patterns = []
+		elif type(value) != type(['']):
+			raise ValueError("remove_pre_update_patterns needs to be in a list format")
+		else:
+			self._remove_pre_update_patterns = value
+
+	# not currently used
+	@property
+	def include_branch_autocheck(self):
+		return self._include_branch_autocheck
+	@include_branch_autocheck.setter
+	def include_branch_autocheck(self, value):
+		try:
+			self._include_branch_autocheck = bool(value)
+		except:
+			raise ValueError("include_branch_autocheck must be a boolean value")
+
+	@property
+	def manual_only(self):
+		return self._manual_only
+	@manual_only.setter
+	def manual_only(self, value):
+		try:
+			self._manual_only = bool(value)
+		except:
+			raise ValueError("manual_only must be a boolean value")
+
+	@property
+	def auto_reload_post_update(self):
+		return self._auto_reload_post_update
+	@auto_reload_post_update.setter
+	def auto_reload_post_update(self, value):
+		try:
+			self._auto_reload_post_update = bool(value)
+		except:
+			raise ValueError("Must be a boolean value")
+
+	@property
+	def fake_install(self):
+		return self._fake_install
+	@fake_install.setter
+	def fake_install(self, value):
+		if type(value) != type(False):
+			raise ValueError("fake_install must be a boolean value")
+		self._fake_install = bool(value)
+
+	@property
+	def user(self):
+		return self._user
+	@user.setter
+	def user(self, va

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list