#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Carla Native Plugins
# Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com>
#
# 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 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.
#
# For a full copy of the GNU General Public License see the doc/GPL.txt file.

# ------------------------------------------------------------------------------------------------------------
# Imports (Global)

from PyQt5.QtCore import Qt

# -----------------------------------------------------------------------
# Imports (Custom)

from carla_shared import *
from carla_utils import *

# -----------------------------------------------------------------------
# Imports (ExternalUI)

from carla_app import CarlaApplication
from externalui import ExternalUI
from widgets.digitalpeakmeter import DigitalPeakMeter

# -----------------------------------------------------------------------
# External UI

class DistrhoUIBigMeter(ExternalUI, DigitalPeakMeter):
    def __init__(self):
        ExternalUI.__init__(self)
        DigitalPeakMeter.__init__(self, None)

        channels = 2 #6 if argv[0].endswith("bigmeterM-ui") else 2

        self.setChannelCount(channels)
        self.setMeterColor(self.COLOR_GREEN)
        self.setMeterOrientation(self.VERTICAL)

        #self.setSmoothRelease(0) # till 5

        self.resize(50, 400)
        self.setWindowTitle(self.fUiName)

        self.fIdleTimer = self.startTimer(30)

        self.ready()

    # -------------------------------------------------------------------
    # DSP Callbacks

    def dspParameterChanged(self, index, value):
        if index == 0:
            color = int(value)

            if color not in (DigitalPeakMeter.COLOR_GREEN,
                             DigitalPeakMeter.COLOR_BLUE):
                return

            self.setMeterColor(color)

        elif index == 1:
            style = int(value)

            if style not in (DigitalPeakMeter.STYLE_DEFAULT,
                             DigitalPeakMeter.STYLE_OPENAV,
                             DigitalPeakMeter.STYLE_RNCBC):
                return

            self.setMeterStyle(style)

        else:
            self.displayMeter(index-1, value)

    # -------------------------------------------------------------------
    # ExternalUI Callbacks

    def uiShow(self):
        self.show()

    def uiFocus(self):
        self.setWindowState((self.windowState() & ~Qt.WindowMinimized) | Qt.WindowActive)
        self.show()

        self.raise_()
        self.activateWindow()

    def uiHide(self):
        self.hide()

    def uiQuit(self):
        self.closeExternalUI()
        self.close()
        app.quit()

    def uiTitleChanged(self, uiTitle):
        self.setWindowTitle(uiTitle)

    # -------------------------------------------------------------------
    # Qt events

    def timerEvent(self, event):
        if event.timerId() == self.fIdleTimer:
            self.idleExternalUI()
        DigitalPeakMeter.timerEvent(self, event)

    def closeEvent(self, event):
        self.closeExternalUI()
        DigitalPeakMeter.closeEvent(self, event)

        # there might be other qt windows open which will block the UI from quitting
        app.quit()

#--------------- main ------------------
if __name__ == '__main__':
    import resources_rc

    pathBinaries, pathResources = getPaths()
    gCarla.utils = CarlaUtils(os.path.join(pathBinaries, "libcarla_utils." + DLL_EXTENSION))
    gCarla.utils.set_process_name("BigMeter")

    app = CarlaApplication("BigMeter")
    gui = DistrhoUIBigMeter()
    app.exit_exec()
