diff options
Diffstat (limited to 'src/stationselector.cpp')
-rw-r--r-- | src/stationselector.cpp | 321 |
1 files changed, 321 insertions, 0 deletions
diff --git a/src/stationselector.cpp b/src/stationselector.cpp new file mode 100644 index 0000000..d604ea8 --- /dev/null +++ b/src/stationselector.cpp @@ -0,0 +1,321 @@ +/*************************************************************************** + stationselector.cpp - description + ------------------- + begin : Son Aug 3 2003 + copyright : (C) 2003 by Martin Witte + email : [email protected] + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +using namespace std; + +#include <kpushbutton.h> +#include <algorithm> + +#include "include/stationlist.h" +#include "include/radiostation.h" + +#include "include/stationselector.h" +#include "include/radiostation-listview.h" + +StationSelector::StationSelector (TQWidget *parent) + : StationSelectorUI(parent), + m_dirty(true) +{ + TQObject::connect(buttonToLeft, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotButtonToLeft())); + TQObject::connect(buttonToRight, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotButtonToRight())); + TQObject::connect(listAvailable, TQT_SIGNAL(sigStationsReceived(const TQStringList&)), this, TQT_SLOT(slotMoveToLeft(const TQStringList&))); + TQObject::connect(listSelected, TQT_SIGNAL(sigStationsReceived(const TQStringList&)), this, TQT_SLOT(slotMoveToRight(const TQStringList&))); + + listSelected->setSelectionMode(TQListView::Extended); + listAvailable->setSelectionMode(TQListView::Extended); +} + + +StationSelector::~StationSelector () +{ +} + + +bool StationSelector::connectI(Interface *i) +{ + bool a = IStationSelectionClient::connectI(i); + bool b = IRadioClient::connectI(i); + return a || b; +} + + +bool StationSelector::disconnectI(Interface *i) +{ + bool a = IStationSelectionClient::disconnectI(i); + bool b = IRadioClient::disconnectI(i); + return a || b; +} + + +bool StationSelector::noticeStationSelectionChanged(const TQStringList &sl) +{ + m_stationIDsNotDisplayed.clear(); + m_stationIDsSelected.clear(); + m_stationIDsAvailable.clear(); + + for (unsigned int i = 0; i < m_stationIDsAll.count(); ++i) { + if (sl.contains(m_stationIDsAll[i])) { + m_stationIDsSelected.append(m_stationIDsAll[i]); + } else { + m_stationIDsAvailable.append(m_stationIDsAll[i]); + } + } + for (unsigned int i = 0; i < sl.count(); ++i) { + if (!m_stationIDsAll.contains(sl[i])) + m_stationIDsNotDisplayed.append(sl[i]); + } + updateListViews(); + m_dirty = false; + return true; +} + + +bool StationSelector::noticeStationsChanged(const StationList &sl) +{ + slotSetDirty(); + + listAvailable->clear(); + listSelected->clear(); + + m_stationIDsAvailable.clear(); + m_stationIDsAll.clear(); + + for (unsigned int i = 0; i < m_stationIDsSelected.count(); ++i) + m_stationIDsNotDisplayed.append(m_stationIDsSelected[i]); + + m_stationIDsSelected.clear(); + + for (RawStationList::Iterator i(sl.all()); i.current(); ++i) { + const TQString &id = i.current()->stationID(); + + m_stationIDsAll.append(id); + if (m_stationIDsNotDisplayed.contains(id)) { + m_stationIDsNotDisplayed.remove(id); + m_stationIDsSelected.append(id); + } else { + m_stationIDsAvailable.append(id); + } + } + + updateListViews(); + return true; +} + + +void StationSelector::slotButtonToLeft() +{ + slotSetDirty(); + listAvailable->clearSelection(); + TQListViewItem *item = listSelected->firstChild(); + int idx_from = 0; + while (item) { + TQListViewItem *next_item = item->nextSibling(); + + if (item->isSelected()) { + + moveItem (listSelected, m_stationIDsSelected, + item, idx_from, + listAvailable, m_stationIDsAvailable); + + --idx_from; + } + item = next_item; + ++idx_from; + } +} + + +void StationSelector::slotButtonToRight() +{ + slotSetDirty(); + listSelected->clearSelection(); + TQListViewItem *item = listAvailable->firstChild(); + int idx_from = 0; + while (item) { + TQListViewItem *next_item = item->nextSibling(); + + if (item->isSelected()) { + + moveItem (listAvailable, m_stationIDsAvailable, + item, idx_from, + listSelected, m_stationIDsSelected); + + --idx_from; + } + item = next_item; + ++idx_from; + } +} + + +void StationSelector::slotMoveToRight(const TQStringList &list) +{ + slotSetDirty(); + listSelected->clearSelection(); + TQListViewItem *item = listAvailable->firstChild(); + int idx_from = 0; + while (item) { + TQListViewItem *next_item = item->nextSibling(); + + if (list.contains(m_stationIDsAvailable[idx_from])) { + + moveItem (listAvailable, m_stationIDsAvailable, + item, idx_from, + listSelected, m_stationIDsSelected); + + --idx_from; + } + item = next_item; + ++idx_from; + } +} + + +void StationSelector::slotMoveToLeft(const TQStringList &list) +{ + slotSetDirty(); + listAvailable->clearSelection(); + TQListViewItem *item = listSelected->firstChild(); + int idx_from = 0; + while (item) { + TQListViewItem *next_item = item->nextSibling(); + + if (list.contains(m_stationIDsSelected[idx_from])) { + + moveItem (listSelected, m_stationIDsSelected, + item, idx_from, + listAvailable, m_stationIDsAvailable); + + --idx_from; + } + item = next_item; + ++idx_from; + } +} + + +void StationSelector::moveItem( + RadioStationListView *fromListView, + TQStringList &fromIDList, + TQListViewItem *item, + int idx_from, + RadioStationListView *toListView, + TQStringList &toIDList +) +{ + fromListView->takeItem(item, idx_from); + + TQString id = fromIDList[idx_from]; + fromIDList.remove(fromIDList.at(idx_from)); + + unsigned int idx_to = 0, + idx_all = 0; + bool found = false; + TQListViewItem *item_to = toListView->firstChild(), + *prev_item_to = NULL; + + while (idx_all < m_stationIDsAll.count() && + idx_to < toIDList.count()) + { + while (m_stationIDsAll[idx_all] != toIDList[idx_to]) + { + if (m_stationIDsAll[idx_all] == id) { + found = true; + break; + } + ++idx_all; + } + if (found) + break; + + prev_item_to = item_to; + item_to = item_to->nextSibling(); + ++idx_to; + } + + toIDList.insert(toIDList.at(idx_to), id); + toListView->insertItem(item, id, idx_to); + if (prev_item_to) { + item->moveItem(prev_item_to); + } else { + item->moveItem(item_to); + if (item_to) item_to->moveItem(item); + } +} + + +void StationSelector::updateListViews() +{ + listAvailable->clear(); + listSelected->clear(); + const StationList &stations = queryStations(); + const RawStationList &sl = stations.all(); + + for (unsigned int i = 0; i < m_stationIDsAvailable.count(); ++i) { + TQString id = m_stationIDsAvailable[i]; + listAvailable->appendStation(sl.stationWithID(id), sl.idxWithID(id)+1); + } + for (unsigned int i = 0; i < m_stationIDsSelected.count(); ++i) { + TQString id = m_stationIDsSelected[i]; + listSelected->appendStation(sl.stationWithID(id), sl.idxWithID(id)+1); + } +} + + +void StationSelector::slotOK() +{ + if (m_dirty) { + TQStringList l = m_stationIDsSelected; + for (unsigned int i = 0; i < m_stationIDsNotDisplayed.count(); ++i) + l.append(m_stationIDsNotDisplayed[i]); + sendStationSelection(l); + } + m_dirty = false; +} + + +void StationSelector::slotCancel() +{ + if (m_dirty) { + noticeStationSelectionChanged(queryStationSelection()); + } + m_dirty = false; +} + + +void StationSelector::saveState (TDEConfig *cfg) const +{ + listSelected->saveState(cfg); + listAvailable->saveState(cfg); +} + + +void StationSelector::restoreState (TDEConfig *cfg) +{ + listSelected->restoreState(cfg); + listAvailable->restoreState(cfg); +} + +void StationSelector::slotSetDirty() +{ + if (!m_dirty) { + m_dirty = true; + emit sigDirty(); + } +} + +#include "stationselector.moc" |