You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tderadio/src/radiostation-listview.cpp

260 lines
7.0 KiB

/***************************************************************************
radiostation-listview.cpp - description
-------------------
begin : Mi Feb 3 2004
copyright : (C) 2003 by Martin Witte
email : witte@kawo1.rwth-aachen.de
***************************************************************************/
/***************************************************************************
* *
* 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 *
* (at your option) any later version. *
* *
***************************************************************************/
#include "include/radiostation-listview.h"
#include "include/stationlist.h"
#include "include/radiostation.h"
#include "include/station-drag-object.h"
#include <tdelocale.h>
#include <tqfile.h>
#include <tqimage.h>
#include <tqpixmap.h>
#include <tdeconfig.h>
RadioStationListView::RadioStationListView(TQWidget *parent, const char *name)
: TDEListView(parent, name)
{
addColumn(i18n("No."));
addColumn(i18n("Icon"));
addColumn(i18n("Station"));
addColumn(i18n("Description"));
setAllColumnsShowFocus(true);
setSorting(-1);
TQObject::connect(this, TQ_SIGNAL(spacePressed(TQListViewItem*)),
this, TQ_SLOT(slotStationActivation(TQListViewItem* )));
TQObject::connect(this, TQ_SIGNAL(returnPressed(TQListViewItem*)),
this, TQ_SLOT(slotStationActivation(TQListViewItem* )));
TQObject::connect(this, TQ_SIGNAL(doubleClicked(TQListViewItem*)),
this, TQ_SLOT(slotStationActivation(TQListViewItem *)));
TQObject::connect(this, TQ_SIGNAL(currentChanged(TQListViewItem*)),
this, TQ_SLOT(slotCurrentStationChanged(TQListViewItem *)));
setAcceptDrops(true);
}
RadioStationListView::~RadioStationListView()
{
}
TQListViewItem *RadioStationListView::getItemForIndex(int idx) const
{
TQListViewItem *item = NULL;
if (idx >= 0 && idx < childCount()) {
item = firstChild();
int i = 0;
while (item && i < idx) {
item = item->nextSibling();
++i;
}
}
return item;
}
int RadioStationListView::getIndexForItem(TQListViewItem *queryItem) const
{
int idx = -1;
if (queryItem) {
TQListViewItem *item = firstChild();
++idx;
while (item && item != queryItem) {
item = item->nextSibling();
++idx;
}
if (!item)
idx = -1;
}
return idx;
}
void RadioStationListView::setStation(int idx, const RadioStation &s, int nr)
{
TQListViewItem *item = getItemForIndex(idx);
if (idx < 0) {
item = new TQListViewItem(this, firstChild());
firstChild()->moveItem(item);
m_StationIDs.prepend(s.stationID());
idx = 0;
} else if (idx >= childCount()) {
item = new TQListViewItem(this, lastChild());
m_StationIDs.append(s.stationID());
idx = childCount() - 1;
}
if (item) {
item->setDragEnabled(true);
item->setDropEnabled(true);
item->setText(0, TQString::number(nr > 0 ? nr : idx+1));
item->setText(2, s.name());
item->setText(3, s.description());
m_StationIDs[idx] = s.stationID();
TQImage img(s.iconName());
if (!img.isNull()) {
int h = img.height();
float f = 0.9 * (float)(item->height()) / (h ? (float)h : 1.0);
item->setPixmap(1, img.smoothScale((int)(img.width()*f), (int)(h * f)));
} else {
item->setPixmap(1, TQPixmap());
}
}
}
void RadioStationListView::appendStation(const RadioStation &st, int nr)
{
setStation(childCount(), st, nr);
}
void RadioStationListView::setStations(const StationList &stations)
{
clear();
for (RawStationList::Iterator it(stations.all()); it.current(); ++it) {
setStation(childCount(), *it.current());
}
}
void RadioStationListView::removeStation(int idx)
{
TQListViewItem *item = getItemForIndex(idx);
if (item) {
delete item;
m_StationIDs.remove(m_StationIDs.at(idx));
}
}
void RadioStationListView::takeItem(TQListViewItem *item, int idx)
{
TQListView::takeItem(item);
m_StationIDs.remove(m_StationIDs.at(idx));
}
void RadioStationListView::insertItem(TQListViewItem *item, const TQString &stationid, int idx_to)
{
TQListView::insertItem(item);
m_StationIDs.insert(m_StationIDs.at(idx_to), stationid);
}
void RadioStationListView::setCurrentStation(int idx)
{
TQListViewItem *item = getItemForIndex(idx);
if (item) {
clearSelection();
setSelected(item, true);
setCurrentItem(item);
}
}
int RadioStationListView::currentStationIndex() const
{
return getIndexForItem(currentItem());
}
void RadioStationListView::slotStationActivation(TQListViewItem *item)
{
emit sigStationActivated(getIndexForItem(item));
}
void RadioStationListView::slotCurrentStationChanged(TQListViewItem *item)
{
emit sigCurrentStationChanged(getIndexForItem(item));
}
void RadioStationListView::saveState (TDEConfig *cfg) const
{
if (!cfg)
return;
for (int i = 0; i < 4; ++i)
cfg->writeEntry(TQString(name()) + "_radiostation_listview_col_" + TQString::number(i), columnWidth(i));
}
void RadioStationListView::restoreState (TDEConfig *cfg)
{
if (!cfg)
return;
for (int i = 0; i < 4; ++i)
setColumnWidth(i, cfg->readNumEntry(TQString(name()) + "_radiostation_listview_col_" + TQString::number(i), -1));
}
TQDragObject *RadioStationListView::dragObject()
{
TQStringList list;
TQListViewItem *item = firstChild();
for (int idx = 0; item; ++idx, item = item->nextSibling()) {
if (item->isSelected()) {
list.append(m_StationIDs[idx]);
}
}
return new StationDragObject(list, this);
}
void RadioStationListView::dragEnterEvent(TQDragEnterEvent* event)
{
event->accept(StationDragObject::canDecode(event));
}
void RadioStationListView::contentsDragEnterEvent(TQDragEnterEvent* event)
{
bool a = StationDragObject::canDecode(event);
if (a)
IErrorLogClient::staticLogDebug(i18n("contentsDragEnterEvent accepted"));
else
IErrorLogClient::staticLogDebug(i18n("contentsDragEnterEvent rejected"));
event->accept(a);
}
void RadioStationListView::dropEvent(TQDropEvent* event)
{
TQStringList list;
if ( StationDragObject::decode(event, list) ) {
emit sigStationsReceived(list);
}
}
void RadioStationListView::contentsDropEvent(TQDropEvent* event)
{
dropEvent(event);
}
void RadioStationListView::contentsDragMoveEvent(TQDragMoveEvent* event)
{
event->accept();
}
#include "radiostation-listview.moc"