diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5c52292 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.pyc +*.swp +.idea +*.iml +build +dist +*.egg* +.DS_Store +*.zip \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..4bf4483 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +include README.md \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c1d72b --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# OctoPrint-Autoscroll + +Turn on/off terminal autoscroll when scrolling up/down + +Turns autoscroll off when scrolling up (rename button to "Now") +Turns autoscroll on when "Now" is pressed or scrolled to the end + +This simulates "Console" application, the OSX log viewer. + +## Setup + +Install via the bundled [Plugin Manager](https://github.com/foosel/OctoPrint/wiki/Plugin:-Plugin-Manager) +or manually using this URL: + + https://github.com/MoonshineSG/Octoprint-Autoscroll/archive/master.zip + + + diff --git a/octoprint_autoscroll/__init__.py b/octoprint_autoscroll/__init__.py new file mode 100644 index 0000000..9ddba3d --- /dev/null +++ b/octoprint_autoscroll/__init__.py @@ -0,0 +1,44 @@ +# coding=utf-8 +import octoprint.plugin +import logging + +class AutoscrollPlugin(octoprint.plugin.AssetPlugin): + + def get_assets(self): + return dict( + js=["js/autoscroll.js"] + ) + + def get_version(self): + return self._plugin_version + + def get_update_information(self): + return dict( + autoscroll=dict( + displayName="Autoscroll", + displayVersion=self._plugin_version, + + # version check: github repository + type="github_release", + user="MoonshineSG", + repo="OctoPrint-Autoscroll", + current=self._plugin_version, + + # update method: pip + pip="https://github.com/MoonshineSG/OctoPrint-Autoscroll/archive/{target_version}.zip" + ) + ) + +__plugin_name__ = "Autoscroll" + + +def __plugin_load__(): + global __plugin_implementation__ + __plugin_implementation__ = AutoscrollPlugin() + + global __plugin_hooks__ + __plugin_hooks__ = { + "octoprint.plugin.softwareupdate.check_config": __plugin_implementation__.get_update_information + } + + diff --git a/octoprint_autoscroll/static/js/autoscroll.js b/octoprint_autoscroll/static/js/autoscroll.js new file mode 100644 index 0000000..2bc46e0 --- /dev/null +++ b/octoprint_autoscroll/static/js/autoscroll.js @@ -0,0 +1,57 @@ +$(function() { + function AutoscrollViewModel(models) { + var self = this; + self.terminal = models[0]; + self.program = false; + + self.onAllBound = function () { + self.terminal.autoscrollEnabled.subscribe(function(newValue) { + if (newValue) { + self.terminal.scrollToEnd(); + self.rename("Autoscroll"); + } else { + self.rename("Now"); + } + }); + + //overwrite the method to set program tag + self.terminal.scrollToEnd = function() { + self.program = true; + if (self.container.length) { + self.container.scrollTop(self.container[0].scrollHeight); + } + } + + self.container = $("#terminal-output"); + + $("#terminal-output").on("scroll", self.scrollhandle); + } + + self.scrollhandle = function(event) { + if (!self.program) { + var auto = false; + if (self.container.length) { + auto = self._almost_equal(self.container[0].scrollHeight - self.container[0].scrollTop, self.container[0].clientHeight) + } + if ( auto ) { + self.terminal.autoscrollEnabled(true); + } else { + self.terminal.autoscrollEnabled(false); + } + } + self.program = false; + } + + self.rename = function(name) { + $(".terminal button").text(name); + } + + self._almost_equal = function(a, b){ + if(Math.abs(a - b) < 5) return true; + return false; + } + + } + ADDITIONAL_VIEWMODELS.push([AutoscrollViewModel, ["terminalViewModel"], []]); +}); + diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..4f8730c --- /dev/null +++ b/setup.py @@ -0,0 +1,94 @@ +# coding=utf-8 + +######################################################################################################################## +### Do not forget to adjust the following variables to your own plugin. + +# The plugin's identifier, has to be unique +plugin_identifier = "autoscroll" + +# The plugin's python package, should be "octoprint_", has to be unique +plugin_package = "octoprint_autoscroll" + +# The plugin's human readable name. Can be overwritten within OctoPrint's internal data via __plugin_name__ in the +# plugin module +plugin_name = "OctoPrint-Autoscroll" + +# The plugin's version. Can be overwritten within OctoPrint's internal data via __plugin_version__ in the plugin module +plugin_version = "0.0.1" + +# The plugin's description. Can be overwritten within OctoPrint's internal data via __plugin_description__ in the plugin +# module +plugin_description = """Turn on/off terminal autoscroll when scrolling up/down""" + +# The plugin's author. Can be overwritten within OctoPrint's internal data via __plugin_author__ in the plugin module +plugin_author = "ovidiu" + +# The plugin's author's mail address. +plugin_author_email = "github@ovidiu.me" + +# The plugin's homepage URL. Can be overwritten within OctoPrint's internal data via __plugin_url__ in the plugin module +plugin_url = "https://github.com/MoonshineSG/OctoPrint-Autoscroll" + +# The plugin's license. Can be overwritten within OctoPrint's internal data via __plugin_license__ in the plugin module +plugin_license = "AGPLv3" + +# Any additional requirements besides OctoPrint should be listed here +plugin_requires = [] + +### -------------------------------------------------------------------------------------------------------------------- +### More advanced options that you usually shouldn't have to touch follow after this point +### -------------------------------------------------------------------------------------------------------------------- + +# Additional package data to install for this plugin. The subfolders "templates", "static" and "translations" will +# already be installed automatically if they exist. +plugin_additional_data = [] + +# Any additional python packages you need to install with your plugin that are not contains in .* +plugin_addtional_packages = [] + +# Any python packages within .* you do NOT want to install with your plugin +plugin_ignored_packages = [] + +# Additional parameters for the call to setuptools.setup. If your plugin wants to register additional entry points, +# define dependency links or other things like that, this is the place to go. Will be merged recursively with the +# default setup parameters as provided by octoprint_setuptools.create_plugin_setup_parameters using +# octoprint.util.dict_merge. +# +# Example: +# plugin_requires = ["someDependency==dev"] +# additional_setup_parameters = {"dependency_links": ["https://github.com/someUser/someRepo/archive/master.zip#egg=someDependency-dev"]} +additional_setup_parameters = {} + +######################################################################################################################## + +from setuptools import setup + +try: + import octoprint_setuptools +except: + print("Could not import OctoPrint's setuptools, are you sure you are running that under " + "the same python installation that OctoPrint is installed under?") + import sys + sys.exit(-1) + +setup_parameters = octoprint_setuptools.create_plugin_setup_parameters( + identifier=plugin_identifier, + package=plugin_package, + name=plugin_name, + version=plugin_version, + description=plugin_description, + author=plugin_author, + mail=plugin_author_email, + url=plugin_url, + license=plugin_license, + requires=plugin_requires, + additional_packages=plugin_addtional_packages, + ignored_packages=plugin_ignored_packages, + additional_data=plugin_additional_data +) + +if len(additional_setup_parameters): + from octoprint.util import dict_merge + setup_parameters = dict_merge(setup_parameters, additional_setup_parameters) + +setup(**setup_parameters) \ No newline at end of file