//////////////////// QmlInit.h //////////////////////////////
class QmlInit : public QObject
{
Q_OBJECT
public:
QmlInit();
private:
QSharedPointer<QDeclarativeView> view;
QSharedPointer<QmlApplicationViewer> viewer;
QSharedPointer<QDeclarativeContext> rootCtxt;
QSharedPointer<TitleListModel> titleListModel;
MapWindow *mapWindow;
DumpSettings *dumpSettings;
QSharedPointer<Evopedia> evopedia;
QString lang;
QString searchPrefix;
QStringList languageList;
QSharedPointer<QStringListModelForQML> languageListModel;
protected:
void closeEvent(QCloseEvent *event);
private slots:
void on_languageChooser_currentIndexChanged(QString text);
void on_searchField_textChanged(QString text);
void refreshSearchResults();
};
////////////////////////// QmlInit.cpp /////////////////////////
QmlInit::QmlInit()
{
titleListModel=QSharedPointer<TitleListModel>(new TitleListModel());
languageList.reserve(1);
searchPrefix=QString("");
// define the view and context for QML interaction
view = QSharedPointer<QDeclarativeView>(new QDeclarativeView());
QDeclarativeContext *rootCtxt = view->rootContext();
// set up the evopedia specifics
titleListModel->setTitleIterator(TitleIterator());
evopedia = (static_cast<EvopediaApplication *>(qApp))->evopedia();
foreach (LocalArchive *b, evopedia->getArchiveManager()->getDefaultLocalArchives())
{
qDebug() << b->getLanguage();
lang = b->getLanguage(); //DEBUG
languageList << b->getLanguage();
on_languageChooser_currentIndexChanged(lang);
refreshSearchResults();
}
languageListModel = QSharedPointer<QStringListModelForQML>(new QStringListModelForQML());
// set the model up in the list view to use the titleListModel
rootCtxt->setContextProperty("titlesModel", titleListModel.data());
rootCtxt->setContextProperty("languageSelectionModel", languageListModel.data());
view->setSource(QUrl("qrc:/Main.qml"));
view->show();
QObject *rootObject= view->rootObject();
QObject::connect(rootObject, SIGNAL(signalLanguageChanged(QString)),
this, SLOT(on_languageChooser_currentIndexChanged(QString)));
QObject::connect(rootObject, SIGNAL(signalSearchTextChanged(QString)),
this, SLOT(on_searchField_textChanged(QString)));
languageListModel->setStringList(languageList);
}
void QmlInit::on_languageChooser_currentIndexChanged(QString text)
{
QObject* rootObject = view->rootObject();
if(rootObject!=NULL)
rootObject->setProperty("languageButtonText",QVariant(text));
lang = text;
refreshSearchResults();
}
void QmlInit::on_searchField_textChanged(QString text)
{
searchPrefix=text;
}
void QmlInit::refreshSearchResults()
{
QSharedPointer<Evopedia> evopedia = (static_cast<EvopediaApplication *>(qApp))->evopedia();
LocalArchive *backend = evopedia->getArchiveManager()->getLocalArchive(lang);
TitleIterator it;
if (backend != 0)
it = backend->getTitlesWithPrefix(searchPrefix);
titleListModel->setTitleIterator(it);
}
///////////////////////////// Main.qml /////////////////////////
PageStackWindow {
id: rootWindow
initialPage: searchPage
SearchPage {
id: searchPage
}
ToolBarLayout {
id: commonTools
visible: true
ToolIcon {
platformIconId: "toolbar-back";
onClicked: {myMenu.close(); pageStack.pop() }
}
ToolIcon {
platformIconId: "toolbar-view-menu"
anchors.right: (parent === undefined) ? undefined : parent.right
onClicked: (myMenu.status == DialogStatus.Closed) ? myMenu.open() : myMenu.close()
}
}
Menu {
id: myMenu
visualParent: pageStack
MenuLayout {
MenuItem { text: qsTr("Settings") }
}
}
}
///////////////////////////////// SearchPage.qml //////////////////
Page {
id: searchPage
tools: commonTools
signal signalLanguageChanged(string lang);
signal signalSearchTextChanged(string text);
ListView {
id: titlesView
anchors {
top: parent.top
bottom: searchField.top
left: parent.left
right: parent.right
}
model: titlesModel
delegate: Text { text: name }
}
TextField {
id: searchField
placeholderText: "Searchterm..."
anchors.bottom: parent.bottom
onTextChanged: {
searchPage.signalSearchTextChanged(searchField.text)
}
}
Button {
id: languageButton
text: "x"
anchors.left: searchField.right
anchors.bottom: parent.bottom
onClicked: langDialog.open()
}
ScrollDecorator {
flickableItem: titlesView
}
SelectionDialog {
id: langDialog
titleText: qsTr("Language")
selectedIndex: 0
model: ListModel { }
onAccepted: {
languageButton.text = langDialog.model.get(langDialog.selectedIndex).name
searchPage.signalLanguageChanged(langDialog.model.get(langDialog.selectedIndex).name)
}
onRejected: {
selectedIndex = 0
searchPage.signalLanguageChanged(langDialog.model.get(langDialog.selectedIndex).name)
}
}
Connections {
target: languageSelectionModel
onStringAdded: {
langDialog.model.append({name: newString})
}
}
}