#include "osstray.h"
#include "osspopup.h"
#include "ossmixerwindow.h"
#include "../../model/ossmodel.h"
#include "../../model/ossdevice.h"

#include <tqevent.h>
#include <tdeglobal.h>
#include <kiconloader.h>
#include <tdestandarddirs.h>
#include <tdelocale.h>
#include <tdeconfig.h>
#include <tdepopupmenu.h>
#include <twin.h>

OssTray::OssTray( OssModel *model, OssMixerWindow *win, TQWidget *parent )
    : KSystemTray(parent), m_model(model), m_win(win),
      m_output(model->preferredOutput()), m_popup(0)
{
    setCaption(i18n("Volume Control"));

    connect(model, TQ_SIGNAL(deviceAdded(OssDevice*)),             this, TQ_SLOT(updateIcon()));
    connect(model, TQ_SIGNAL(preferredOutputChanged(OssDevice*)),  this, TQ_SLOT(onPreferredChanged(OssDevice*)));

    if ( m_output ) {
        connect(m_output, TQ_SIGNAL(volumeChanged(int)), this, TQ_SLOT(updateIcon()));
        connect(m_output, TQ_SIGNAL(muteChanged(bool)),  this, TQ_SLOT(updateIcon()));
    }

    updateIcon();
}

void OssTray::onPreferredChanged( OssDevice *dev )
{
    if ( m_output ) {
        disconnect(m_output, TQ_SIGNAL(volumeChanged(int)), this, TQ_SLOT(updateIcon()));
        disconnect(m_output, TQ_SIGNAL(muteChanged(bool)),  this, TQ_SLOT(updateIcon()));
    }
    m_output = dev;
    if ( m_output ) {
        connect(m_output, TQ_SIGNAL(volumeChanged(int)), this, TQ_SLOT(updateIcon()));
        connect(m_output, TQ_SIGNAL(muteChanged(bool)),  this, TQ_SLOT(updateIcon()));
    }
    updateIcon();
}

void OssTray::updateIcon()
{
    if ( !m_output ) m_output = m_model->preferredOutput();

    int  vol  = m_output ? m_output->volume() : 0;
    bool mute = m_output ? m_output->muted()  : true;

    const char *pic;
    if ( mute || vol == 0 )  pic = "audio-volume-muted.png";
    else if ( vol < 34 )     pic = "audio-volume-low.png";
    else if ( vol < 67 )     pic = "audio-volume-medium.png";
    else                     pic = "audio-volume-high.png";

    TQString path = TDEGlobal::dirs()->findResource("data",
        TQString("tmix/pics/crystal/") + pic);
    if ( !path.isEmpty() ) setPixmap(TQPixmap(path));
}

void OssTray::mousePressEvent( TQMouseEvent *e )
{
    if ( e->button() == TQt::LeftButton ) {
        TDEConfig *cfg = TDEGlobal::config();
        cfg->setGroup("Tray");
        int mode = cfg->readNumEntry("PopupMode", 1);
        if ( mode == 1 ) {
            if ( !m_popup )
                m_popup = new OssPopup(m_model, this);
            if ( m_popup->justHidden() ) return;
            m_popup->toggleAt(mapToGlobal(TQPoint(0,0)), size());
        } else {
            m_win->bringToFront();
        }
        e->accept();
        return;
    }
    if ( e->button() == TQt::MidButton ) {
        middleClickMute();
        e->accept();
        return;
    }
    KSystemTray::mousePressEvent(e);
}

void OssTray::middleClickMute()
{
    if ( !m_output ) return;
    TDEConfig *cfg = TDEGlobal::config();
    cfg->setGroup("Tray");
    if ( cfg->readBoolEntry("MiddleClickMute", false) )
        m_output->setMuted( !m_output->muted() );
}

void OssTray::wheelEvent( TQWheelEvent *e )
{
    if ( !m_output ) return;
    TDEConfig *cfg = TDEGlobal::config();
    cfg->setGroup("Tray");
    int step  = cfg->readNumEntry("ScrollStep", 5);
    int delta = e->delta() > 0 ? step : -step;
    int vol   = m_output->volume() + delta;
    if ( vol < 0 )   vol = 0;
    if ( vol > 100 ) vol = 100;
    m_output->setVolume(vol);
}

void OssTray::contextMenuAboutToShow( TDEPopupMenu *menu )
{
    while ( menu->count() > 1 )
        menu->removeItemAt(1);

    menu->insertItem(SmallIcon("tmix"), i18n("&Open Mixer"),
                     m_win, TQ_SLOT(bringToFront()));
    menu->insertSeparator();
    menu->insertItem(SmallIcon("configure"), i18n("&Configure TMix..."),
                     m_win, TQ_SLOT(showPreferences()));
    menu->insertItem(SmallIcon("help"), i18n("&About TMix"),
                     m_win, TQ_SLOT(showAbout()));
    menu->insertSeparator();
    menu->insertItem(SmallIcon("application-exit"), i18n("&Quit"),
                     m_win, TQ_SLOT(quit()));
}

#include "osstray.moc"
