diff options
Diffstat (limited to 'lsseteditor.h')
-rw-r--r-- | lsseteditor.h | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/lsseteditor.h b/lsseteditor.h new file mode 100644 index 0000000..a89131d --- /dev/null +++ b/lsseteditor.h @@ -0,0 +1,148 @@ +#ifndef LSSETEDITOR_H +#define LSSETEDITOR_H + +#include <QWidget> +#include <QSpinBox> +#include <QComboBox> + +class _LSSetEntryEditorBaseBase : public QWidget { + Q_OBJECT +protected: + explicit _LSSetEntryEditorBaseBase(QWidget *parent = 0) : + QWidget(parent) { } + +signals: + void dataEdited(); +}; + +template <typename TData> +class LSSetEntryEditorBase : public _LSSetEntryEditorBaseBase { +protected: + explicit LSSetEntryEditorBase(QWidget *parent = 0) : + _LSSetEntryEditorBaseBase(parent) { } + +private: + void setCurrentEntry(TData &entry); + // what?? + //friend class LSSetEditor<TData, LSSetEntryEditorBase<TData> >; + + TData *m_currentEntry; + +protected: + virtual void loadEntryFrom(const TData &entry) = 0; + TData *currentEntry() const { return m_currentEntry; } +}; + + + + +class _LSSetEditorBase : public QWidget { + Q_OBJECT +public: + explicit _LSSetEditorBase(int maxEntries, QWidget *parent = 0); + +protected: + int m_maxEntries; + QSpinBox *m_entryCount; + QComboBox *m_chooser; + + QWidget *m_setEditorWidget; + + int m_loadingThings; + + void setup(QWidget *eWidget); + + virtual void changeEntryCountTo(int count) = 0; + virtual void showEntry(int index) = 0; + virtual void resizeDataListTo(int count) = 0; + +private slots: + void handleEntryCountChanged(int count); + void handleEntrySelected(int index); + +signals: + void dataEdited(); + +}; + +template <typename TData, typename TWidget> +class LSSetEditor : public _LSSetEditorBase { +public: + explicit LSSetEditor(int maxEntries, QWidget *parent = 0) : + _LSSetEditorBase(maxEntries, parent) { + + TWidget *w = new TWidget(this); + setup(w); + + LSSetEntryEditorBase<TData> *checkMe = w; + connect(checkMe, SIGNAL(dataEdited()), SIGNAL(dataEdited())); + } + + void setData(QList<TData> *newData) { + m_loadingThings++; + + m_data = newData; + m_entryCount->setValue(newData->count()); + changeEntryCountTo(newData->count()); + + m_chooser->setCurrentIndex(newData->count() ? 0 : -1); + showEntry(newData->count() ? 0 : -1); + + m_loadingThings--; + } + +protected: + QList<TData> *m_data; + + void changeEntryCountTo(int count) { + m_loadingThings++; + + int existingCount = m_chooser->count(); + + if (existingCount > count) { + // remove something + int nowSelected = m_chooser->currentIndex(); + + if (nowSelected >= count) { + // oops, we'll need to select something else + showEntry(count - 1); + m_chooser->setCurrentIndex(count - 1); + } + + for (int i = (existingCount - 1); i >= count; i--) + m_chooser->removeItem(i); + + } else if (count > existingCount) { + // add something + + for (int i = existingCount; i < count; i++) + m_chooser->addItem(QString("Set %1").arg(i + 1)); + } + + m_loadingThings--; + } + + void resizeDataListTo(int count) { + m_data->reserve(count); + + while (m_data->count() < count) + m_data->append(TData()); + while (m_data->count() > count) + m_data->removeLast(); + } + + void showEntry(int index) { + m_loadingThings++; + + if (index == -1) { + m_setEditorWidget->setEnabled(false); + } else { + const TData &entry = m_data->at(index); + } + } +}; + + + + +#endif // LSSETEDITOR_H |