
image:https://img.shields.io/badge/status-alpha-orange.svg[badge]
image:https://img.shields.io/badge/version-0.1.0-orange.svg[badge]
image:https://img.shields.io/pypi/v/dashing.svg?style=plastic["Latest Version", link="https://pypi.python.org/pypi/dashing"]
image:https://img.shields.io/badge/License-LGPL%20v3-blue.svg[License]

Dashing is a library to quickly create terminal-based dashboards in Python.

image:https://raw.githubusercontent.com/FedericoCeratto/dashing/gh-pages/tty.gif[Example]

Similar libraries for other languages: https://github.com/gizak/termui[termui] https://github.com/chjj/blessed[blessed] https://github.com/yaronn/blessed-contrib[blessed-contrib]

=== Dependencies

The link:https://pypi.python.org/pypi/blessed[blessed] library.

=== Installation

Use packages from your Linux distribution, or:

[source,bash]
----
pip install dashing
----

=== Quick mode

If you want to provide a simple UI to a script, Dashing can generate a layout automatically.


[source,python]
----
import time
from dashing import QuickDash

def main():
    d = QuickDash()
    d.status = "Running..."
    d.logs.append("Started")
    for progress in range(100):
      d.gauges['progess'] = progress
      if progress % 10 == 0:
        d.logs.append("Started")
      time.sleep(0.05)

    d.status = "Done!"
    time.sleep(1)
----


=== Normal mode

In normal mode you have full control over the UI

.Usage
[source,python]
----
from time import sleep, time
import math

from dashing import *

if __name__ == '__main__':

    ui = HSplit(
            VSplit(
                HGauge(val=50, title="only title", border_color=5),
                HGauge(label="only label", val=20, border_color=5),
                HGauge(label="only label", val=30, border_color=5),
                HGauge(label="only label", val=50, border_color=5),
                HGauge(label="only label", val=80, border_color=5),
                HGauge(val=20),
                HGauge(label="label, no border", val=55),
                HSplit(
                    VGauge(val=0, border_color=2),
                    VGauge(val=5, border_color=2),
                    VGauge(val=30, border_color=2),
                    VGauge(val=50, border_color=2),
                    VGauge(val=80, border_color=2, color=4),
                    VGauge(val=95, border_color=2, color=3),
                    ColorRangeVGauge(
                        val=100,
                        border_color=2,
                        colormap=(
                            (33, 2),
                            (66, 3),
                            (100, 1),
                        )
                    ),
                )
            ),
            VSplit(
                Text('Hello World,\nthis is dashing.', border_color=2),
                Log(title='logs', border_color=5),
                VChart(border_color=2, color=2),
                HChart(border_color=2, color=2),
                HBrailleChart(border_color=2, color=2),
                # HBrailleFilledChart(border_color=2, color=2),
            ),
            title='Dashing',
        )
    log = ui.items[1].items[1]
    vchart = ui.items[1].items[2]
    hchart = ui.items[1].items[3]
    bchart = ui.items[1].items[4]
    # bfchart = ui.items[1].items[5]
    log.append("0 -----")
    log.append("1 Hello")
    log.append("2 -----")
    prev_time = time()
    for cycle in range(0, 200):
        ui.items[0].items[0].value = int(50 + 49.9 * math.sin(cycle / 80.0))
        ui.items[0].items[1].value = int(50 + 45 * math.sin(cycle / 20.0))
        ui.items[0].items[2].value = int(50 + 45 * math.sin(cycle / 30.0 + 3))

        vgauges = ui.items[0].items[-1].items
        for gaugenum, vg in enumerate(vgauges):
            vg.value = 50 + 49.9 * math.sin(cycle / 12.0 + gaugenum)

        t = int(time())
        if t != prev_time:
            log.append("%s" % t)
            prev_time = t
        vchart.append(50 + 50 * math.sin(cycle / 16.0))
        hchart.append(99.9 * abs(math.sin(cycle / 26.0)))
        bchart.append(50 + 50 * math.sin(cycle / 6.0))
        # bfchart.append(50 + 50 * math.sin(cycle / 16.0))
        ui.display()

        sleep(1.0/25)
----

