From bb467534ecac666816ae036272a474174d9d8449 Mon Sep 17 00:00:00 2001 From: gilead Date: Tue, 14 Sep 2010 23:20:18 +0200 Subject: [PATCH] Fixed searchclients to handle new Google URLs correctly; added GUI rotation with options dialog --- debian/changelog | 15 +- src/control/maincontroller.cpp | 11 + src/control/maincontroller.h | 5 + src/control/settingscontroller.cpp | 71 ++++++- src/control/settingscontroller.h | 20 +- src/data/settings.cpp | 3 +- src/data/settings.h | 10 + src/movieschedule.cpp | 5 +- src/searchclients/abstractsearchclient.cpp | 17 +- src/searchclients/abstractsearchclient.h | 1 + src/searchclients/movieschedulesearchclient.cpp | 21 +- src/searchclients/moviesearchclient.cpp | 22 +- src/searchclients/theaterschedulesearchclient.cpp | 32 ++- src/searchclients/theatersearchclient.cpp | 23 ++- src/src.pro | 8 +- src/translations/movie-schedule_de.ts | 76 +++++-- src/ui/aboutdialog.cpp | 14 ++ src/ui/aboutdialog.h | 3 + src/ui/aboutdialog.ui | 228 +++++++++++---------- src/ui/backgroundlabel.cpp | 5 +- src/ui/contextdialog.cpp | 14 +- src/ui/contextdialog.h | 2 + src/ui/locationdialog.cpp | 22 +- src/ui/locationdialog.h | 2 + src/ui/locationdialog.ui | 54 ++--- src/ui/mainwindow.cpp | 20 ++ src/ui/mainwindow.h | 3 + src/ui/optionsdialog.cpp | 98 +++++++++ src/ui/optionsdialog.h | 42 ++++ src/ui/optionsdialog.ui | 102 +++++++++ src/ui/styleutils.cpp | 3 + src/ui/uiutils.cpp | 14 ++ src/ui/uiutils.h | 3 + 33 files changed, 772 insertions(+), 197 deletions(-) create mode 100644 src/ui/optionsdialog.cpp create mode 100644 src/ui/optionsdialog.h create mode 100644 src/ui/optionsdialog.ui diff --git a/debian/changelog b/debian/changelog index 6de16f9..12b3d67 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,10 +1,23 @@ +movie-schedule (0.3.0-1) unstable; urgency=low + + * Fixed german translation file + * Updated options dialog layout + + -- Jochen Becher Sun, 13 Sep 2010 22:30:00 +0000 + +movie-schedule (0.3.0) unstable; urgency=low + + * Add GUI rotation (including options dialog) (Closes: #6256) + * Fix access of Googles movie pages (Closes: #6399) + + -- Jochen Becher Sun, 12 Sep 2010 23:00:00 +0000 + movie-schedule (0.2.2) unstable; urgency=low * Fixed interpretation of schedule times (Closes: #6234) -- Jochen Becher Sun, 05 Sep 2010 22:15:00 +0000 - movie-schedule (0.2.1) unstable; urgency=low * Fixed link to bugtracker in debian/control files (Closes: #6226) diff --git a/src/control/maincontroller.cpp b/src/control/maincontroller.cpp index 5130da7..e409fdc 100644 --- a/src/control/maincontroller.cpp +++ b/src/control/maincontroller.cpp @@ -26,6 +26,7 @@ #include "control/actioncontroller.h" #include "control/locationcontroller.h" #include "control/itemmodelsortclient.h" +#include "control/settingscontroller.h" #include "ui/aboutdialog.h" #include "ui/mainwindow.h" #include "ui/theatermodel.h" @@ -51,6 +52,7 @@ MainController::MainController(MainWindow *main_window, Settings *settings, Cine MovieController *movie_controller, LocationController *location_controller, ActionController *action_controller, + SettingsController *settings_controller, ItemModelSortController *sort_controller, QThread *search_worker) : _main_window(main_window), @@ -60,6 +62,7 @@ MainController::MainController(MainWindow *main_window, Settings *settings, Cine _movie_controller(movie_controller), _location_controller(location_controller), _action_controller(action_controller), + _settings_controller(settings_controller), _sort_controller(sort_controller), _search_worker(search_worker), _connectivity_manager(new ConnectivityManager(this)), @@ -80,11 +83,14 @@ MainController::MainController(MainWindow *main_window, Settings *settings, Cine connect(_main_window, SIGNAL(MovieSelected(MovieKey)), _movie_controller, SLOT(ShowMovie(MovieKey))); connect(_main_window, SIGNAL(SearchMovieInWeb(MovieKey)), _action_controller, SLOT(SearchMovieInWeb(MovieKey))); connect(_main_window, SIGNAL(OpenLocationDialog()), _location_controller, SLOT(OpenLocationDialog())); + connect(_main_window, SIGNAL(OpenOptionsDialog()), _settings_controller, SLOT(OpenSettingsDialog())); connect(_main_window, SIGNAL(OpenAboutDialog()), this, SLOT(OpenAboutDialog())); + connect(_settings_controller, SIGNAL(SettingsChanged(Settings)), this, SLOT(SettingsChanged(Settings))); connect(_location_controller, SIGNAL(Search(Location)), this, SLOT(Search(Location))); connect(_connectivity_manager, SIGNAL(Connected()), this, SLOT(NetworkConnected())); connect(_connectivity_manager, SIGNAL(Disconnected()), this, SLOT(NetworkDisconnected())); connect(_connectivity_manager, SIGNAL(Error()), this, SLOT(NetworkError())); + _main_window->SetOrientation(settings->GetOrientationMode()); } MainController::~MainController() @@ -182,6 +188,11 @@ void MainController::NetworkError() _main_window->SetError(tr(MSG_NETWORK_ERROR)); } +void MainController::SettingsChanged(const Settings &settings) +{ + _main_window->SetOrientation(settings.GetOrientationMode()); +} + void MainController::SearchTheaters() { _settings->SetSearchObjectsType(Settings::THEATERS); diff --git a/src/control/maincontroller.h b/src/control/maincontroller.h index 30f9f4e..d0a3fe1 100644 --- a/src/control/maincontroller.h +++ b/src/control/maincontroller.h @@ -29,6 +29,7 @@ class TheaterController; class MovieController; class LocationController; class ActionController; +class SettingsController; class ItemModelSortController; class TheaterModel; class MovieModel; @@ -43,6 +44,7 @@ public: MainController(MainWindow *main_window, Settings *settings, CinemaSchedule *cinema_schedule, TheaterController *theater_controller, MovieController *movie_controller, LocationController *location_controller, ActionController *action_controller, + SettingsController *settings_controller, ItemModelSortController *sort_controller, QThread *search_worker); ~MainController(); @@ -56,6 +58,8 @@ private: Q_SLOT void NetworkDisconnected(); Q_SLOT void NetworkError(); + Q_SLOT void SettingsChanged(const Settings &settings); + Q_SLOT void SearchTheaters(); Q_SLOT void SearchMovies(); Q_SLOT void OpenAboutDialog(); @@ -90,6 +94,7 @@ private: MovieController *_movie_controller; LocationController *_location_controller; ActionController *_action_controller; + SettingsController *_settings_controller; ItemModelSortController *_sort_controller; QThread *_search_worker; ConnectivityManager *_connectivity_manager; diff --git a/src/control/settingscontroller.cpp b/src/control/settingscontroller.cpp index a5e1188..aa88363 100644 --- a/src/control/settingscontroller.cpp +++ b/src/control/settingscontroller.cpp @@ -18,6 +18,8 @@ #include "settingscontroller.h" #include "data/settings.h" +#include "ui/mainwindow.h" +#include "ui/optionsdialog.h" #include #include @@ -25,8 +27,9 @@ #include #include -SettingsController::SettingsController(Settings *settings) - : _settings(settings) +SettingsController::SettingsController(MainWindow *main_window, Settings *settings) + : _main_window(main_window), + _settings(settings) { } @@ -40,6 +43,7 @@ enum State { STATE_PREVIOUS_LOCATION_NAME, STATE_GPS, STATE_SEARCH, + STATE_ORIENTATION }; void SettingsController::Load() @@ -72,11 +76,15 @@ void SettingsController::Load() state = STATE_GPS; } else if (state == STATE_SETTINGS && xml.name() == "search") { state = STATE_SEARCH; + } else if (state == STATE_SETTINGS && xml.name() == "orientation") { + state = STATE_ORIENTATION; } else { state = STATE_DOCUMENT; } } else if (token == QXmlStreamReader::EndElement) { - if (state == STATE_SEARCH) { + if (state == STATE_ORIENTATION) { + state = STATE_SETTINGS; + } else if (state == STATE_SEARCH) { state = STATE_SETTINGS; } else if (state == STATE_GPS) { state = STATE_SETTINGS; @@ -107,6 +115,14 @@ void SettingsController::Load() } else if (xml.text() == "movies") { _settings->SetSearchObjectsType(Settings::MOVIES); } + } else if (state == STATE_ORIENTATION) { + if (xml.text() == "landscape") { + _settings->SetOrientationMode(Settings::LANDSCAPE); + } else if (xml.text() == "portrait") { + _settings->SetOrientationMode(Settings::PORTRAIT); + } else if (xml.text() == "autorotation") { + _settings->SetOrientationMode(Settings::AUTOROTATION); + } } } } @@ -131,18 +147,18 @@ void SettingsController::Save() xml.writeStartElement("settings"); xml.writeStartElement("location"); xml.writeTextElement("name", _settings->GetLocation().GetLocationName()); - xml.writeEndElement(); + xml.writeEndElement(); // xml.writeStartElement("previous-locations"); Q_FOREACH(Location location, _settings->GetPreviousLocations()) { xml.writeStartElement("location"); xml.writeTextElement("name", location.GetLocationName()); xml.writeEndElement(); } - xml.writeEndElement(); + xml.writeEndElement(); // QString v; xml.writeStartElement("gps"); xml.writeAttribute("enabled", _settings->IsGPSEnabled() ? "yes" : "no"); - xml.writeEndElement(); + xml.writeEndElement(); // switch (_settings->GetSearchObjectsType()) { case Settings::THEATERS: v = "theaters"; @@ -152,7 +168,19 @@ void SettingsController::Save() break; } xml.writeTextElement("search", v); - xml.writeEndElement(); + switch (_settings->GetOrientationMode()) { + case Settings::LANDSCAPE: + v = "landscape"; + break; + case Settings::PORTRAIT: + v = "portrait"; + break; + case Settings::AUTOROTATION: + v = "autorotation"; + break; + } + xml.writeTextElement("orientation", v); + xml.writeEndElement(); // xml.writeEndDocument(); } else { // TODO error message unable to create file @@ -160,6 +188,35 @@ void SettingsController::Save() } } +void SettingsController::EmitInitialSettings() +{ + emit SettingsChanged(*_settings); +} + +void SettingsController::OpenSettingsDialog() +{ +#ifdef Q_WS_MAEMO_5 + OptionsDialog *dialog = new OptionsDialog(_main_window); + connect(dialog, SIGNAL(Accept(Settings)), this, SLOT(AcceptSettingsDialog(Settings))); + connect(dialog, SIGNAL(Cancel(Settings)), this, SLOT(CancelSettingsDialog(Settings))); + dialog->SetSettings(*_settings); + dialog->show(); + // dialog deletes itself +#endif +} + +void SettingsController::AcceptSettingsDialog(const Settings &settings) +{ + *_settings = settings; + emit SettingsChanged(settings); +} + +void SettingsController::CancelSettingsDialog(const Settings &settings) +{ + Q_UNUSED(settings); + // do nothing +} + QString SettingsController::GetSettingsFileName() { QString dirpath = QDir::homePath() + "/.movie-schedule"; diff --git a/src/control/settingscontroller.h b/src/control/settingscontroller.h index 7d7889c..2a44ac5 100644 --- a/src/control/settingscontroller.h +++ b/src/control/settingscontroller.h @@ -19,21 +19,37 @@ #define SETTINGSCONTROLLER_H #include +#include +class MainWindow; class Settings; -class SettingsController +class SettingsController : public QObject { + Q_OBJECT public: - SettingsController(Settings *settings); + SettingsController(MainWindow *main_window, Settings *settings); void Load(); void Save(); + void EmitInitialSettings(); + +public: + Q_SIGNAL void SettingsChanged(const Settings &); + +public: + Q_SLOT void OpenSettingsDialog(); + +private: + Q_SLOT void AcceptSettingsDialog(const Settings &); + Q_SLOT void CancelSettingsDialog(const Settings &); + private: QString GetSettingsFileName(); private: + MainWindow *_main_window; Settings *_settings; }; diff --git a/src/data/settings.cpp b/src/data/settings.cpp index 6c1528a..8b90acd 100644 --- a/src/data/settings.cpp +++ b/src/data/settings.cpp @@ -21,7 +21,8 @@ Settings::Settings() : _location(), _previous_locations(), _gps_enabled(true), - _search_objects_type(MOVIES) + _search_objects_type(MOVIES), + _rotation_mode(AUTOROTATION) { } diff --git a/src/data/settings.h b/src/data/settings.h index d94c76c..40fb2b7 100644 --- a/src/data/settings.h +++ b/src/data/settings.h @@ -33,6 +33,12 @@ public: MOVIES }; + enum OrientationMode { + LANDSCAPE, + PORTRAIT, + AUTOROTATION + }; + public: Settings(); @@ -48,11 +54,15 @@ public: SearchObjectsType GetSearchObjectsType() const { return _search_objects_type; } void SetSearchObjectsType(SearchObjectsType search_objects_type) { _search_objects_type = search_objects_type; } + OrientationMode GetOrientationMode() const { return _rotation_mode; } + void SetOrientationMode(OrientationMode rotation_mode) { _rotation_mode = rotation_mode; } + private: Location _location; Locations _previous_locations; bool _gps_enabled; SearchObjectsType _search_objects_type; + OrientationMode _rotation_mode; }; #endif // SETTINGS_H diff --git a/src/movieschedule.cpp b/src/movieschedule.cpp index 0063016..ec44af9 100644 --- a/src/movieschedule.cpp +++ b/src/movieschedule.cpp @@ -105,7 +105,7 @@ int MovieSchedule::exec(int argc, char *argv[]) main_window.show(); Settings settings; - SettingsController settings_controller(&settings); + SettingsController settings_controller(&main_window, &settings); settings_controller.Load(); ActionController action_controller(&cinema_schedule); @@ -131,8 +131,9 @@ int MovieSchedule::exec(int argc, char *argv[]) MainController main_controller(&main_window, &settings, &cinema_schedule, &theater_controller, &movie_controller, &location_controller, &action_controller, - &sort_controller, &search_worker); + &settings_controller, &sort_controller, &search_worker); + settings_controller.EmitInitialSettings(); main_controller.Run(); int rc = app.exec(); diff --git a/src/searchclients/abstractsearchclient.cpp b/src/searchclients/abstractsearchclient.cpp index c19b7bc..eea2103 100644 --- a/src/searchclients/abstractsearchclient.cpp +++ b/src/searchclients/abstractsearchclient.cpp @@ -48,20 +48,21 @@ void AbstractSearchClient::Search(const QUrl &url, int start) } QNetworkRequest request; QUrl xurl(url); - if (_start != 0) { + if (_start != 0 && !url.hasQueryItem("start")) { xurl.addQueryItem("start", QString::number(_start)); } FixLocation(&xurl); //std::cout << "URL: " << qPrintable(QString(xurl.toEncoded())) << std::endl; request.setUrl(xurl); - //request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9"); + //request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/9.10 (karmic) Firefox/3.6.8"); request.setRawHeader("User-Agent", "Mozilla/5.0"); //request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); request.setRawHeader("Accept", "application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); request.setRawHeader("Accept-Language", "en-gb;q=1.0,en;q=0.9,de-de;q=0.5,de;q=0.3"); + //request.setRawHeader("Accept-Language", "en-us,en;q=0.8,de-de;q=0.5,de;q=0.3"); //request.setRawHeader("Accept-Encoding", "gzip,deflate"); request.setRawHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); - request.setRawHeader("Keep-Alive", "300"); + request.setRawHeader("Keep-Alive", "115"); request.setRawHeader("Connection", "keep-alive"); request.setRawHeader("Cache-Control", "max-age=0"); QNetworkReply *reply = _network->get(request); @@ -69,6 +70,12 @@ void AbstractSearchClient::Search(const QUrl &url, int start) connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(NetworkError(QNetworkReply::NetworkError))); } +void AbstractSearchClient::SearchEncodedUrl(const QString &encoded_url, int start) +{ + QUrl url = QUrl::fromEncoded((QString("http://www.google.com") + encoded_url).toAscii()); + Search(url, start); +} + void AbstractSearchClient::DownloadProgress(qint64 a,qint64 b) { //std::cout << "Search Progress of " << qPrintable(objectName()) << " - " << a << ", " << b << std::endl; @@ -146,6 +153,7 @@ QList AbstractSearchClient::TimesFromString(const QList &time_st void AbstractSearchClient::FixLocation(QUrl *url) { +#if 0 // Try to fix the Google url which returns // wrong locations in some links if (_location.isNull()) { @@ -172,6 +180,9 @@ void AbstractSearchClient::FixLocation(QUrl *url) url->addQueryItem("defaultloc", _location); } } +#else + Q_UNUSED(url); +#endif } QMutex AbstractSearchClient::_next_search_task_id_mutex; diff --git a/src/searchclients/abstractsearchclient.h b/src/searchclients/abstractsearchclient.h index 123984b..9286ce2 100644 --- a/src/searchclients/abstractsearchclient.h +++ b/src/searchclients/abstractsearchclient.h @@ -39,6 +39,7 @@ protected: int GetStartIndex() { return _start; } virtual void Search(const QUrl &url, int start); + virtual void SearchEncodedUrl(const QString &endcoded_url, int start); public: Q_SIGNAL void SearchStarted(int search_task_id); diff --git a/src/searchclients/movieschedulesearchclient.cpp b/src/searchclients/movieschedulesearchclient.cpp index 7041c5e..235f549 100644 --- a/src/searchclients/movieschedulesearchclient.cpp +++ b/src/searchclients/movieschedulesearchclient.cpp @@ -78,6 +78,7 @@ enum State { PARSE_LINK, PARSE_BR, PARSE_SPAN, + PARSE_NEXT_PAGE_LINK }; void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply) @@ -92,6 +93,8 @@ void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply) QString theater_phone; QList schedule; QRegExp time_pattern("\\d+:\\d+([aApP][mM])*"); + QString next_page_url; + int next_page_start; while (!xml.atEnd()) { QXmlStreamReader::TokenType token = xml.readNext(); if (token == QXmlStreamReader::StartElement) { @@ -102,7 +105,7 @@ void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply) //std::cout << "LINK " << qPrintable(attr_href) << std::endl; if (url.hasQueryItem("date")) { QString v = url.queryItemValue("date"); - std::cout << "FOUND Date Link " << qPrintable(v) << " from " << qPrintable(url.toString()) << std::endl; + //std::cout << "FOUND Date Link " << qPrintable(v) << " from " << qPrintable(url.toString()) << std::endl; if (!_dates_seen.contains(v)) { // TODO replace location with user selected location (Google simplifies to much) _dates_seen.insert(v); @@ -115,6 +118,16 @@ void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply) theater_phone = ""; schedule.clear(); state = PARSE_THEATER_LINK; + } else if (url.hasQueryItem("start")) { + QString sort = url.queryItemValue("sort"); + QString start = url.queryItemValue("start"); + int istart = start.toInt(); + if (sort == "0" && istart > GetStartIndex()) { + //std::cout << "next page LINK " << qPrintable(attr_href) << std::endl; + next_page_url = attr_href; + next_page_start = istart; + } + state = PARSE_NEXT_PAGE_LINK; } else { state = PARSE_HTML; } @@ -176,6 +189,8 @@ void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply) } } } + } else if (state == PARSE_NEXT_PAGE_LINK) { + state = PARSE_HTML; } } else if (token == QXmlStreamReader::Characters) { if (state == PARSE_THEATER_LINK) { @@ -214,9 +229,9 @@ void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply) emit SearchFinished(GetSearchTaskId(), false); deleteLater(); } else { - if (found > 0) { + if (!next_page_url.isEmpty()) { emit Reply(GetSearchTaskId(), true); - Search(GetStartIndex() + found); + SearchEncodedUrl(next_page_url, next_page_start); } else { if (!_date_urls.isEmpty()) { SearchNextDate(); diff --git a/src/searchclients/moviesearchclient.cpp b/src/searchclients/moviesearchclient.cpp index 670c569..ec642ec 100644 --- a/src/searchclients/moviesearchclient.cpp +++ b/src/searchclients/moviesearchclient.cpp @@ -48,6 +48,7 @@ void MovieSearchClient::CancelAllRunningSearchs() void MovieSearchClient::Search(int start) { QUrl url("http://www.google.com/m/movies"); + url.addQueryItem("action","chgloc"); url.addQueryItem("loc", _town); url.addQueryItem("sort", QString::number(1)); AbstractSearchClient::Search(url, start); @@ -58,7 +59,8 @@ enum State { PARSE_MOVIE_LINK, PARSE_EXPECT_DIV1, PARSE_EXPECT_DIV2, PARSE_DIV2, - PARSE_SPAN, PARSE_RATING, PARSE_TRAILER + PARSE_SPAN, PARSE_RATING, PARSE_TRAILER, + PARSE_NEXT_PAGE_LINK }; void MovieSearchClient::ReplyFinished(QNetworkReply *reply) @@ -73,6 +75,8 @@ void MovieSearchClient::ReplyFinished(QNetworkReply *reply) QString movie_theaters_url; QRegExp duration_pattern("((\\d+)hr )?(\\d+)min"); QRegExp reviews_pattern("\\d+ review(s)?"); + QString next_page_url; + int next_page_start; while (!xml.atEnd()) { QXmlStreamReader::TokenType token = xml.readNext(); if (token == QXmlStreamReader::StartElement) { @@ -88,6 +92,16 @@ void MovieSearchClient::ReplyFinished(QNetworkReply *reply) movie_rating = -1.0; movie_theaters_url = attr_href; state = PARSE_MOVIE_LINK; + } else if (url.hasQueryItem("start")) { + QString sort = url.queryItemValue("sort"); + QString start = url.queryItemValue("start"); + int istart = start.toInt(); + if (sort == "1" && istart > GetStartIndex()) { + //std::cout << "next page LINK " << qPrintable(attr_href) << std::endl; + next_page_url = attr_href; + next_page_start = istart; + } + state = PARSE_NEXT_PAGE_LINK; } else { state = PARSE_HTML; } @@ -151,6 +165,8 @@ void MovieSearchClient::ReplyFinished(QNetworkReply *reply) } } state = PARSE_HTML; + } else if (state == PARSE_NEXT_PAGE_LINK) { + state = PARSE_HTML; } } else if (token == QXmlStreamReader::Characters) { if (state == PARSE_MOVIE_LINK) { @@ -178,9 +194,9 @@ void MovieSearchClient::ReplyFinished(QNetworkReply *reply) emit SearchFinished(GetSearchTaskId(), false); deleteLater(); } else { - if (found > 0) { + if (!next_page_url.isEmpty()) { emit Reply(GetSearchTaskId(), true); - Search(GetStartIndex() + found); + SearchEncodedUrl(next_page_url, next_page_start); } else { emit Reply(GetSearchTaskId(), false); emit SearchFinished(GetSearchTaskId(), true); diff --git a/src/searchclients/theaterschedulesearchclient.cpp b/src/searchclients/theaterschedulesearchclient.cpp index 82f8482..3172279 100644 --- a/src/searchclients/theaterschedulesearchclient.cpp +++ b/src/searchclients/theaterschedulesearchclient.cpp @@ -82,6 +82,7 @@ enum State { PARSE_MOVIE_EXPECT_DIV3, PARSE_MOVIE_DIV3, PARSE_MOVIE_TIME, + PARSE_NEXT_PAGE_LINK }; void TheaterScheduleSearchClient::ReplyFinished(QNetworkReply *reply) @@ -97,6 +98,8 @@ void TheaterScheduleSearchClient::ReplyFinished(QNetworkReply *reply) QRegExp duration_pattern("((\\d+)hr )?(\\d+)min"); QRegExp reviews_pattern("\\d+ review(s)?"); QXmlStreamReader xml(reply); + QString next_page_url; + int next_page_start; while (!xml.atEnd()) { QXmlStreamReader::TokenType token = xml.readNext(); if (token == QXmlStreamReader::StartElement) { @@ -122,6 +125,16 @@ void TheaterScheduleSearchClient::ReplyFinished(QNetworkReply *reply) rating = -1.0; schedule.clear(); state = PARSE_MOVIE_LINK; + } else if (url.hasQueryItem("start")) { + QString sort = url.queryItemValue("sort"); + QString start = url.queryItemValue("start"); + int istart = start.toInt(); + if (sort == "0" && istart > GetStartIndex()) { + //std::cout << "next page LINK " << qPrintable(attr_href) << std::endl; + next_page_url = attr_href; + next_page_start = istart; + } + state = PARSE_NEXT_PAGE_LINK; } else { state = PARSE_HTML; } @@ -215,6 +228,8 @@ void TheaterScheduleSearchClient::ReplyFinished(QNetworkReply *reply) } } state = PARSE_HTML; + } else if (state == PARSE_NEXT_PAGE_LINK) { + state = PARSE_HTML; } } else if (token == QXmlStreamReader::Characters) { if (state == PARSE_MOVIE_LINK) { @@ -251,15 +266,18 @@ void TheaterScheduleSearchClient::ReplyFinished(QNetworkReply *reply) emit Cancelled(GetSearchTaskId()); emit SearchFinished(GetSearchTaskId(), false); } else { - // all movies are listed on one page - // no repetition of search with start parameter - if (!_date_urls.isEmpty()) { + if (!next_page_url.isEmpty()) { emit Reply(GetSearchTaskId(), true); - SearchNextDate(); + SearchEncodedUrl(next_page_url, next_page_start); } else { - emit Reply(GetSearchTaskId(), false); - emit SearchFinished(GetSearchTaskId(), true); - deleteLater(); + if (!_date_urls.isEmpty()) { + emit Reply(GetSearchTaskId(), true); + SearchNextDate(); + } else { + emit Reply(GetSearchTaskId(), false); + emit SearchFinished(GetSearchTaskId(), true); + deleteLater(); + } } } reply->deleteLater(); diff --git a/src/searchclients/theatersearchclient.cpp b/src/searchclients/theatersearchclient.cpp index f4f02dc..adfbdaa 100644 --- a/src/searchclients/theatersearchclient.cpp +++ b/src/searchclients/theatersearchclient.cpp @@ -47,6 +47,7 @@ void TheaterSearchClient::CancelAllRunningSearchs() void TheaterSearchClient::Search(int start) { QUrl url("http://www.google.com/m/movies"); + url.addQueryItem("action","chgloc"); url.addQueryItem("loc", _town); url.addQueryItem("sort", QString::number(0)); AbstractSearchClient::Search(url, start); @@ -58,11 +59,13 @@ enum State { PARSE_THEATER_DIV, PARSE_THEATER_BR, PARSE_THEATER_SPAN, - PARSE_THEATER_PHONE + PARSE_THEATER_PHONE, + PARSE_NEXT_PAGE_LINK }; void TheaterSearchClient::ReplyFinished(QNetworkReply *reply) { + //std::cout << qPrintable(QString::fromUtf8(reply->readAll().data())) << std::endl; QXmlStreamReader xml(reply); State state = PARSE_HTML; int found = 0; @@ -70,6 +73,8 @@ void TheaterSearchClient::ReplyFinished(QNetworkReply *reply) QString theater_address; QString theater_movies_url; QString theater_phone; + QString next_page_url; + int next_page_start; while (!xml.atEnd()) { QXmlStreamReader::TokenType token = xml.readNext(); if (token == QXmlStreamReader::StartElement) { @@ -84,6 +89,16 @@ void TheaterSearchClient::ReplyFinished(QNetworkReply *reply) theater_movies_url = attr_href; theater_phone = ""; state = PARSE_THEATER_LINK; + } else if (url.hasQueryItem("start")) { + QString sort = url.queryItemValue("sort"); + QString start = url.queryItemValue("start"); + int istart = start.toInt(); + if (sort == "0" && istart > GetStartIndex()) { + //std::cout << "next page LINK " << qPrintable(attr_href) << std::endl; + next_page_url = attr_href; + next_page_start = istart; + } + state = PARSE_NEXT_PAGE_LINK; } else { state = PARSE_HTML; } @@ -127,6 +142,8 @@ void TheaterSearchClient::ReplyFinished(QNetworkReply *reply) } } state = PARSE_HTML; + } else if (state == PARSE_NEXT_PAGE_LINK) { + state = PARSE_HTML; } } else if (token == QXmlStreamReader::Characters) { if (state == PARSE_THEATER_LINK) { @@ -148,9 +165,9 @@ void TheaterSearchClient::ReplyFinished(QNetworkReply *reply) emit SearchFinished(GetSearchTaskId(), false); deleteLater(); } else { - if (found > 0) { + if (!next_page_url.isEmpty()) { emit Reply(GetSearchTaskId(), true); - Search(GetStartIndex() + found); + SearchEncodedUrl(next_page_url, next_page_start); } else { emit Reply(GetSearchTaskId(), false); emit SearchFinished(GetSearchTaskId(), true); diff --git a/src/src.pro b/src/src.pro index eb34058..e6df7f9 100644 --- a/src/src.pro +++ b/src/src.pro @@ -157,7 +157,7 @@ FORMS += \ ui/locationdialog.ui \ ui/moviewindow.ui \ ui/contextdialog.ui \ - ui/aboutdialog.ui + ui/aboutdialog.ui \ RESOURCES += \ resources.qrc @@ -180,6 +180,12 @@ OTHER_FILES += \ ../debian/optify \ ../debian/compat +maemo5 { + SOURCES += ui/optionsdialog.cpp + HEADERS += ui/optionsdialog.h + FORMS += ui/optionsdialog.ui +} + !isEmpty(TRANSLATIONS) { isEmpty(QMAKE_LRELEASE) { win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe diff --git a/src/translations/movie-schedule_de.ts b/src/translations/movie-schedule_de.ts index 234d259..6598244 100644 --- a/src/translations/movie-schedule_de.ts +++ b/src/translations/movie-schedule_de.ts @@ -14,7 +14,7 @@ MovieSchedule - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -95,13 +95,11 @@ p, li { white-space: pre-wrap; } Telefonanruf fehlgeschlagen: Kein Anruf möglich. - Unable to search in web: communication bus not available. - Websuche fehlgeschlagen: Kommunikation mit Browser nicht möglich. + Websuche fehlgeschlagen: Kommunikation mit Browser nicht möglich. - - + Unable to search in web: browser service not available. Websuche fehlgeschlagen: Browser steht nicht zur Verfügung. @@ -155,17 +153,17 @@ p, li { white-space: pre-wrap; } Ort - + Search Near In der Nähe suchen - + City Stadt - + Search Suchen @@ -177,27 +175,27 @@ p, li { white-space: pre-wrap; } Netzwerk steht nicht zur Verfügung. - + Unable to access network. Netzwerk steht nicht zur Verfügung. - + No theaters found near %1. Keine Kinos in der Nähe von %1 gefunden. - + No movies found near %1. Keine Filme in der Nähe von %1 gefunden. - + Error on fetching theaters. Fehler beim Lesen der Kinoliste. - + Error on fetching movies. Fehler beim Lesen der Filmliste. @@ -206,13 +204,13 @@ p, li { white-space: pre-wrap; } MainWindow - + Movies Filme - + Theaters Kinos @@ -223,22 +221,27 @@ p, li { white-space: pre-wrap; } + Options + Einstellungen + + + About Über - + Call By Phone Kino anrufen - + Find Route Weg zum Kino suchen - - + + Search In Web Im Web suchen @@ -248,7 +251,7 @@ p, li { white-space: pre-wrap; } - + MovieSchedule MovieSchedule @@ -275,6 +278,39 @@ p, li { white-space: pre-wrap; } + OptionsDialog + + + Options + Einstellungen + + + + Orientation + Orientierung + + + + Done + Fertig + + + + Landscape + Querformat + + + + Portrait + Hochformat + + + + Automatic Rotation + Automatische Drehung + + + QObject diff --git a/src/ui/aboutdialog.cpp b/src/ui/aboutdialog.cpp index 63e5d6c..ae3f857 100644 --- a/src/ui/aboutdialog.cpp +++ b/src/ui/aboutdialog.cpp @@ -16,7 +16,11 @@ // along with MovieSchedule. If not, see . #include "aboutdialog.h" + #include "ui_aboutdialog.h" +#include "uiutils.h" + +#include AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent), @@ -33,9 +37,19 @@ AboutDialog::AboutDialog(QWidget *parent) : connect(ui->_button_box, SIGNAL(rejected()), this, SLOT(deleteLater())); connect(ui->_contact_button, SIGNAL(clicked()), this, SLOT(deleteLater())); connect(ui->_contact_button, SIGNAL(clicked()), this, SIGNAL(ContactAuthor())); + connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(Rotate())); + Rotate(); } AboutDialog::~AboutDialog() { delete ui; } + +void AboutDialog::Rotate() +{ + bool landscape = UiUtils::IsLandscape(); + ui->_dialog_layout->setDirection(landscape ? QBoxLayout::LeftToRight : QBoxLayout::TopToBottom); + ui->_button_box->setOrientation(landscape ? Qt::Vertical : Qt::Horizontal); + adjustSize(); +} diff --git a/src/ui/aboutdialog.h b/src/ui/aboutdialog.h index 0ea60e9..45ecf51 100644 --- a/src/ui/aboutdialog.h +++ b/src/ui/aboutdialog.h @@ -36,6 +36,9 @@ public: Q_SIGNAL void ContactAuthor(); private: + Q_SLOT void Rotate(); + +private: Ui::AboutDialog *ui; }; diff --git a/src/ui/aboutdialog.ui b/src/ui/aboutdialog.ui index c3e37f2..f088196 100644 --- a/src/ui/aboutdialog.ui +++ b/src/ui/aboutdialog.ui @@ -13,8 +13,8 @@ About - - + + @@ -32,81 +32,79 @@ - - - - Qt::Vertical - - - QDialogButtonBox::Cancel - - - - - - - Qt::ScrollBarAlwaysOff - - - true - - - - - 0 - 0 - 311 - 434 - - - - - - - - - 255 - 0 - 0 - - - - - - - - - 255 - 0 - 0 - - - - - - - - - 255 - 255 - 255 - - - - - - - - - - - - 0 - 0 - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + + + + + + + 0 + 240 + + + + Qt::ScrollBarAlwaysOff + + + true + + + + + 0 + 0 + 307 + 457 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + + + + 0 + 0 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> @@ -115,44 +113,60 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Movies, Theaters, Schedules and GPS Locations use </span><a href="http://www.google.com"><span style=" font-size:18pt; font-weight:600; text-decoration: underline; color:#2eacff;">Google</span></a><span style=" font-size:18pt;"> services.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:18pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt;">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 3 of the License, or (at your option) any later version.</span></p></body></html> + + + Qt::RichText + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + true + + + + + + + + + + + + + Contact - - Qt::RichText - - - true + + false - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + Done - - true + + + + + + Qt::Vertical - - true + + QDialogButtonBox::Cancel - - - - - - - Contact - - - false - - - - - - - Done - - + + diff --git a/src/ui/backgroundlabel.cpp b/src/ui/backgroundlabel.cpp index b9c622b..2ae0e2c 100644 --- a/src/ui/backgroundlabel.cpp +++ b/src/ui/backgroundlabel.cpp @@ -16,9 +16,11 @@ // along with MovieSchedule. If not, see . #include "backgroundlabel.h" +#include "uiutils.h" #include #include +#include static const int MINIMUM_FONT_SIZE = 40; @@ -50,9 +52,10 @@ void BackgroundLabel::paintEvent(QPaintEvent *event) QRect widget_rect = painter.worldTransform().inverted().mapRect(rect()); if (_cached_label_font_size <= 0 || widget_rect != _cached_widget_rect) { + bool landscape = rect().width() >= rect().height(); _cached_widget_rect = widget_rect; _cached_label_rect = widget_rect; - _cached_label_rect.setTop(_cached_label_rect.top() + 20); + _cached_label_rect.setTop(_cached_label_rect.top() + (landscape ? 20 : 10)); _cached_label_alignment = Qt::AlignHCenter | Qt::AlignTop; int font_size = 80; diff --git a/src/ui/contextdialog.cpp b/src/ui/contextdialog.cpp index 6122238..330f1da 100644 --- a/src/ui/contextdialog.cpp +++ b/src/ui/contextdialog.cpp @@ -23,8 +23,10 @@ #include "data/cinema.h" #include "data/movie.h" #include "utils/assertedlocker.h" +#include "uiutils.h" #include +#include ContextDialog::ContextDialog(CinemaSchedule *cinema_schedule, QWidget *parent) : QDialog(parent), @@ -40,6 +42,8 @@ ContextDialog::ContextDialog(CinemaSchedule *cinema_schedule, QWidget *parent) : connect(ui->find_route_to_theater, SIGNAL(clicked()), this, SLOT(FindRouteToTheater())); connect(ui->search_movie_in_web, SIGNAL(clicked()), this, SLOT(SearchMovieInWeb())); connect(ui->search_theater_in_web, SIGNAL(clicked()), this, SLOT(SearchTheaterInWeb())); + connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(Rotate())); + Rotate(); } ContextDialog::~ContextDialog() @@ -98,10 +102,11 @@ void ContextDialog::removeAllWidgets() void ContextDialog::addWidget(QWidget *widget) { + bool landscape = UiUtils::IsLandscape(); widget->setVisible(true); ui->gridLayout->addWidget(widget, _next_row, _next_column, 1, 1); ++_next_column; - if (_next_column > 1) { + if (_next_column > (landscape ? 1 : 0)) { ++_next_row; _next_column = 0; } @@ -136,3 +141,10 @@ void ContextDialog::SearchTheaterInWeb() hide(); emit SearchTheaterInWeb(_schedule_entry_key.GetCinemaKey()); } + +void ContextDialog::Rotate() +{ + if (isVisible()) { + Show(_schedule_entry_key); + } +} diff --git a/src/ui/contextdialog.h b/src/ui/contextdialog.h index 29c724e..13c9f96 100644 --- a/src/ui/contextdialog.h +++ b/src/ui/contextdialog.h @@ -61,6 +61,8 @@ private: Q_SLOT void SearchMovieInWeb(); Q_SLOT void SearchTheaterInWeb(); + Q_SLOT void Rotate(); + private: Ui::ContextDialog *ui; CinemaSchedule *_cinema_schedule; diff --git a/src/ui/locationdialog.cpp b/src/ui/locationdialog.cpp index 095da2b..c05de0b 100644 --- a/src/ui/locationdialog.cpp +++ b/src/ui/locationdialog.cpp @@ -17,6 +17,9 @@ #include "locationdialog.h" #include "ui_locationdialog.h" +#include "uiutils.h" + +#include LocationDialog::LocationDialog(QWidget *parent) : QDialog(parent), @@ -39,6 +42,8 @@ LocationDialog::LocationDialog(QWidget *parent) : _location_buttons.append(ui->Location3); _location_buttons.append(ui->Location4); _location_buttons.append(ui->Location5); + connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(Rotate())); + Rotate(); } LocationDialog::~LocationDialog() @@ -80,6 +85,7 @@ void LocationDialog::SetGPSEnabled(bool gps_enabled) void LocationDialog::show() { + bool landscape = UiUtils::IsLandscape(); ui->gridLayout->removeWidget(ui->GPS); for (int i = 0; i < _location_buttons.size(); ++i) { ui->gridLayout->removeWidget(_location_buttons[i]); @@ -89,12 +95,16 @@ void LocationDialog::show() if (ui->GPS->isEnabled()) { ui->gridLayout->addWidget(ui->GPS, row, column); ++column; + if (column > (landscape ? 1 : 0)) { + ++row; + column = 0; + } } for (int i = 0; i < _location_buttons.size(); ++i) { if (_location_buttons[i]->isEnabled()) { ui->gridLayout->addWidget(_location_buttons[i], row, column); ++column; - if (column > 1) { + if (column > (landscape ? 1 : 0)) { ++row; column = 0; } @@ -175,3 +185,13 @@ void LocationDialog::changeEvent(QEvent *e) break; } } + +void LocationDialog::Rotate() +{ + bool landscape = UiUtils::IsLandscape(); + ui->_search_layout->setDirection(landscape ? QBoxLayout::LeftToRight : QBoxLayout::TopToBottom); + ui->_button_box->setOrientation(landscape ? Qt::Vertical : Qt::Horizontal); + if (isVisible()) { + show(); + } +} diff --git a/src/ui/locationdialog.h b/src/ui/locationdialog.h index f4d966e..4e297f5 100644 --- a/src/ui/locationdialog.h +++ b/src/ui/locationdialog.h @@ -63,6 +63,8 @@ private: Q_SLOT void PreviousLocation4Clicked(); Q_SLOT void PreviousLocation5Clicked(); + Q_SLOT void Rotate(); + private: void PreviousLocationClicked(int i); diff --git a/src/ui/locationdialog.ui b/src/ui/locationdialog.ui index 45a5d81..7b8133d 100644 --- a/src/ui/locationdialog.ui +++ b/src/ui/locationdialog.ui @@ -23,21 +23,6 @@ true - - 4 - - - 16 - - - 8 - - - 16 - - - 8 - @@ -106,26 +91,27 @@ - - - 4 - - - - - City - - - + - - - - 0 - 0 - - - + + + + + City + + + + + + + + 0 + 0 + + + + + diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index d78aae4..d4e9293 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -75,6 +75,7 @@ MainWindow::MainWindow(const CinemaSchedule *cinema_schedule, QWidget *parent) : ui->menubar->addAction(tr("Movies"), this, SIGNAL(SearchMovies())); ui->menubar->addAction(tr("Theaters"), this, SIGNAL(SearchTheaters())); ui->menubar->addAction(tr("Location"), this, SIGNAL(OpenLocationDialog())); + ui->menubar->addAction(tr("Options"), this, SIGNAL(OpenOptionsDialog())); ui->menubar->addAction(tr("About"), this, SIGNAL(OpenAboutDialog())); _theater_context_menu = new QMenu(this); _theater_phone_call = _theater_context_menu->addAction(tr("Call By Phone"), this, SLOT(CallTheaterByPhone())); @@ -89,6 +90,25 @@ MainWindow::~MainWindow() delete ui; } +void MainWindow::SetOrientation(Settings::OrientationMode orientation) +{ +#ifdef Q_WS_MAEMO_5 + switch (orientation) { + case Settings::LANDSCAPE: + setAttribute(Qt::WA_Maemo5LandscapeOrientation, true); + break; + case Settings::PORTRAIT: + setAttribute(Qt::WA_Maemo5PortraitOrientation, true); + break; + case Settings::AUTOROTATION: + setAttribute(Qt::WA_Maemo5AutoOrientation, true); + break; + } +#else + Q_UNUSED(orientation); +#endif +} + void MainWindow::SetLocation(Location location) { _location = location; diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index 8a6c3e7..b4220e7 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -22,6 +22,7 @@ #include "data/location.h" #include "data/cinemakey.h" #include "data/moviekey.h" +#include "data/settings.h" #include @@ -43,6 +44,7 @@ public: ~MainWindow(); public: + Q_SLOT void SetOrientation(Settings::OrientationMode orientation); Q_SLOT void SetLocation(Location location); Q_SLOT void SetTheaterModel(QAbstractItemModel *); Q_SLOT void SetMovieModel(QAbstractItemModel *); @@ -52,6 +54,7 @@ public: Q_SIGNAL void SearchTheaters(); Q_SIGNAL void SearchMovies(); Q_SIGNAL void OpenLocationDialog(); + Q_SIGNAL void OpenOptionsDialog(); Q_SIGNAL void OpenAboutDialog(); Q_SIGNAL void TheaterSelected(CinemaKey); Q_SIGNAL void MovieSelected(MovieKey); diff --git a/src/ui/optionsdialog.cpp b/src/ui/optionsdialog.cpp new file mode 100644 index 0000000..085fac2 --- /dev/null +++ b/src/ui/optionsdialog.cpp @@ -0,0 +1,98 @@ +#include "optionsdialog.h" +#include "ui_optionsdialog.h" +#include "uiutils.h" + +#include +#include +#include +#include +#include + +static QStandardItem *CreateItem(const QString &label) +{ + QStandardItem *item = new QStandardItem(label); + item->setTextAlignment(Qt::AlignCenter); + item->setEditable(false); + return item; +} + +OptionsDialog::OptionsDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::OptionsDialog), + _rotation_model(new QStandardItemModel(0, 1, this)), + _rotation_selector(new QMaemo5ListPickSelector()) +{ + ui->setupUi(this); + ui->_button_box->addButton(ui->_done_button, QDialogButtonBox::AcceptRole); + connect(ui->_button_box, SIGNAL(accepted()), this, SLOT(Accept())); + connect(ui->_button_box, SIGNAL(accepted()), this, SLOT(deleteLater())); + connect(ui->_button_box, SIGNAL(rejected()), this, SLOT(Cancel())); + connect(ui->_button_box, SIGNAL(rejected()), this, SLOT(deleteLater())); + ui->_rotation_combo_box->setValueLayout(QMaemo5ValueButton::ValueBesideText); + _rotation_model->appendRow(CreateItem(tr("Landscape"))); + _rotation_model->appendRow(CreateItem(tr("Portrait"))); + _rotation_model->appendRow(CreateItem(tr("Automatic Rotation"))); + _rotation_selector->setModel(_rotation_model); + _rotation_selector->setCurrentIndex(0); + ui->_rotation_combo_box->setPickSelector(_rotation_selector); + connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(Rotate())); + Rotate(); +} + +OptionsDialog::~OptionsDialog() +{ + delete ui; +} + +void OptionsDialog::SetSettings(const Settings &settings) +{ + _settings = settings; + int i = 0; + switch (_settings.GetOrientationMode()) { + case Settings::LANDSCAPE: + i = 0; + break; + case Settings::PORTRAIT: + i = 1; + break; + case Settings::AUTOROTATION: + i = 2; + break; + } + _rotation_selector->setCurrentIndex(i); +} + +Settings OptionsDialog::GetSettings() +{ + switch (_rotation_selector->currentIndex()) { + case 0: + _settings.SetOrientationMode(Settings::LANDSCAPE); + break; + case 1: + _settings.SetOrientationMode(Settings::PORTRAIT); + break; + case 2: + _settings.SetOrientationMode(Settings::AUTOROTATION); + break; + } + return _settings; +} + +void OptionsDialog::Accept() +{ + emit Accept(GetSettings()); +} + +void OptionsDialog::Cancel() +{ + emit Cancel(GetSettings()); +} + +void OptionsDialog::Rotate() +{ + bool landscape = UiUtils::IsLandscape(); + ui->_dialog_layout->setDirection(landscape ? QBoxLayout::LeftToRight : QBoxLayout::TopToBottom); + ui->_button_box->setOrientation(landscape ? Qt::Vertical : Qt::Horizontal); + ui->_rotation_combo_box->setValueLayout(landscape ? QMaemo5ValueButton::ValueBesideText : QMaemo5ValueButton::ValueUnderText); + adjustSize(); +} diff --git a/src/ui/optionsdialog.h b/src/ui/optionsdialog.h new file mode 100644 index 0000000..00536a4 --- /dev/null +++ b/src/ui/optionsdialog.h @@ -0,0 +1,42 @@ +#ifndef OPTIONSDIALOG_H +#define OPTIONSDIALOG_H + +#include "data/settings.h" + +#include + +class QStandardItemModel; +class QMaemo5ListPickSelector; + +namespace Ui { + class OptionsDialog; +} + +class OptionsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit OptionsDialog(QWidget *parent = 0); + ~OptionsDialog(); + + void SetSettings(const Settings &settings); + Settings GetSettings(); + +public: + Q_SIGNAL void Accept(const Settings &); + Q_SIGNAL void Cancel(const Settings &); + +private: + Q_SLOT void Accept(); + Q_SLOT void Cancel(); + Q_SLOT void Rotate(); + +private: + Ui::OptionsDialog *ui; + QStandardItemModel *_rotation_model; + QMaemo5ListPickSelector *_rotation_selector; + Settings _settings; +}; + +#endif // OPTIONSDIALOG_H diff --git a/src/ui/optionsdialog.ui b/src/ui/optionsdialog.ui new file mode 100644 index 0000000..827ffc5 --- /dev/null +++ b/src/ui/optionsdialog.ui @@ -0,0 +1,102 @@ + + + OptionsDialog + + + + 0 + 0 + 400 + 131 + + + + Options + + + + + + + + Orientation + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + + + Qt::Vertical + + + QDialogButtonBox::Cancel + + + + + + + Done + + + + + + + + QMaemo5ValueButton + QPushButton +
QMaemo5ValueButton
+
+
+ + + + _button_box + accepted() + OptionsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + _button_box + rejected() + OptionsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + +
diff --git a/src/ui/styleutils.cpp b/src/ui/styleutils.cpp index 82e6a90..9319814 100644 --- a/src/ui/styleutils.cpp +++ b/src/ui/styleutils.cpp @@ -64,6 +64,7 @@ QColor StyleUtils::GetScheduleTimeColor(const QPalette &palette, QTime time) { Q_UNUSED(time); #ifdef Q_WS_MAEMO_5 + Q_UNUSED(palette); return QMaemo5Style::standardColor("DefaultTextColor"); #else QColor color = palette.color(QPalette::WindowText); @@ -75,6 +76,7 @@ QColor StyleUtils::GetDayTextColor(const QPalette &palette, const QDate &date) { Q_UNUSED(date); #ifdef Q_WS_MAEMO_5 + Q_UNUSED(palette); QColor color = QMaemo5Style::standardColor("DefaultTextColor"); color.setAlpha(160); return color; @@ -89,6 +91,7 @@ QColor StyleUtils::GetDayBackgroundColor(const QPalette &palette, const QDate &d { Q_UNUSED(date); #ifdef Q_WS_MAEMO_5 + Q_UNUSED(palette); QColor color = QMaemo5Style::standardColor("DefaultTextColor"); color.setAlpha(48); return color; diff --git a/src/ui/uiutils.cpp b/src/ui/uiutils.cpp index 95a5748..ddee5b9 100644 --- a/src/ui/uiutils.cpp +++ b/src/ui/uiutils.cpp @@ -23,6 +23,9 @@ #include #endif +#include +#include + UiUtils::UiUtils() { } @@ -44,3 +47,14 @@ void UiUtils::ShowError(const QString &errormsg) QMessageBox::critical(0, "Movie-Schedule", errormsg); #endif } + +bool UiUtils::IsLandscape() +{ + QRect screenGeometry = QApplication::desktop()->screenGeometry(); + return (screenGeometry.width() > screenGeometry.height()); +} + +bool UiUtils::IsPortrait() +{ + return !IsLandscape(); +} diff --git a/src/ui/uiutils.h b/src/ui/uiutils.h index 4254036..ee8f594 100644 --- a/src/ui/uiutils.h +++ b/src/ui/uiutils.h @@ -31,6 +31,9 @@ public: static void ShowError(const QString &errormsg); + static bool IsLandscape(); + + static bool IsPortrait(); }; #endif // UIUTILS_H -- 1.7.9.5