#include "osspopup.h"
#include "ossdevicewidget.h"
#include "../../model/ossmodel.h"
#include "../../model/ossdevice.h"

#include <tqlayout.h>
#include <tqlabel.h>
#include <tqapplication.h>
#include <tqdesktopwidget.h>
#include <twin.h>
#include <tdelocale.h>

OssPopup::OssPopup( OssModel *model, TQWidget *parent )
    : TQWidget( parent, "OssPopup",
                WStyle_Customize | WType_Popup | WStyle_DialogBorder ),
      m_model(model), m_container(0), m_widget(0)
{
    TQVBoxLayout *outer = new TQVBoxLayout(this, 4, 0);
    m_container = new TQWidget(this);
    outer->addWidget(m_container);

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

    rebuild();
}

void OssPopup::rebuild()
{
    delete m_container->layout();
    if ( m_widget ) { delete m_widget; m_widget = 0; }

    TQVBoxLayout *vbox = new TQVBoxLayout(m_container, 4, 0);
    OssDevice *dev = m_model->preferredOutput();
    if ( dev ) {
        m_widget = new OssDeviceWidget(dev, m_container);
        vbox->addWidget(m_widget);
        m_widget->show();
    } else {
        vbox->addWidget(new TQLabel(i18n("No output device."), m_container));
    }

    if ( isVisible() ) adjustSize();
}

void OssPopup::toggleAt( const TQPoint &trayPos, const TQSize &traySize )
{
    if ( isVisible() ) { hide(); return; }

    rebuild();
    adjustSize();

    TQRect screen = TQApplication::desktop()->screenGeometry(trayPos);
    int x = trayPos.x() + traySize.width() / 2 - width() / 2;
    int y = trayPos.y() - height();
    if ( y < screen.top() )             y = trayPos.y() + traySize.height();
    if ( x + width() > screen.right() ) x = screen.right() - width();
    if ( x < screen.left() )            x = screen.left();

    move(x, y);
    show();

    KWin::setState(winId(), NET::KeepAbove | NET::SkipTaskbar | NET::SkipPager);
    KWin::setOnAllDesktops(winId(), true);
}

bool OssPopup::justHidden() const
{
    return m_hideTime.isValid() && m_hideTime.elapsed() < 100;
}

void OssPopup::hideEvent( TQHideEvent *e )
{
    TQWidget::hideEvent(e);
    m_hideTime.start();
}

#include "osspopup.moc"
