New upstream version 0.7.0 upstream/0.7.0
authorgregor herrmann <gregoa@debian.org>
Fri, 30 Jul 2021 00:00:56 +0000 (02:00 +0200)
committergregor herrmann <gregoa@debian.org>
Fri, 30 Jul 2021 00:00:56 +0000 (02:00 +0200)
78 files changed:
BUGS
ChangeLog
NEWS
README
data/at.priv.toastfreeware.confclerk.metainfo.xml [new file with mode: 0644]
data/confclerk.1
data/confclerk.png
data/confclerk.pod
src/alarm/alarm.cpp
src/alarm/alarm.h
src/app/application.cpp
src/app/application.h
src/app/appsettings.cpp
src/app/appsettings.h
src/app/main.cpp
src/db.qrc
src/dbschema001to002.sql [new file with mode: 0644]
src/dbschema002.sql [new file with mode: 0644]
src/global.pri
src/gui/about.ui
src/gui/conferenceeditor.cpp
src/gui/conferenceeditor.h
src/gui/conferenceeditor.ui
src/gui/conflictdialogcontainer.cpp
src/gui/conflictdialogcontainer.h
src/gui/conflictsdialog.cpp
src/gui/conflictsdialog.h
src/gui/daynavigatorwidget.cpp
src/gui/daynavigatorwidget.h
src/gui/dayviewtabcontainer.cpp
src/gui/dayviewtabcontainer.h
src/gui/errormessage.cpp
src/gui/errormessage.h
src/gui/eventdialog.cpp
src/gui/eventdialog.h
src/gui/favtabcontainer.cpp
src/gui/favtabcontainer.h
src/gui/mainwindow.cpp
src/gui/mainwindow.h
src/gui/roomstabcontainer.cpp
src/gui/roomstabcontainer.h
src/gui/searchhead.cpp
src/gui/searchhead.h
src/gui/searchtabcontainer.cpp
src/gui/searchtabcontainer.h
src/gui/settingsdialog.cpp
src/gui/settingsdialog.h
src/gui/tabcontainer.cpp
src/gui/tabcontainer.h
src/gui/trackstabcontainer.cpp
src/gui/trackstabcontainer.h
src/gui/urlinputdialog.cpp
src/gui/urlinputdialog.h
src/mvc/conference.cpp
src/mvc/conference.h
src/mvc/conferencemodel.cpp
src/mvc/conferencemodel.h
src/mvc/delegate.cpp
src/mvc/delegate.h
src/mvc/event.cpp
src/mvc/event.h
src/mvc/eventmodel.cpp
src/mvc/eventmodel.h
src/mvc/mvc.pro
src/mvc/room.cpp
src/mvc/room.h
src/mvc/track.cpp
src/mvc/track.h
src/mvc/treeview.cpp
src/mvc/treeview.h
src/orm/ormrecord.h
src/sql/schedulexmlparser.cpp
src/sql/schedulexmlparser.h
src/sql/sqlengine.cpp
src/sql/sqlengine.h
src/test/main.cpp
src/test/mvc/eventtest.cpp
src/test/mvc/eventtest.h

diff --git a/BUGS b/BUGS
index bb2e95513b2137a32406d110cb553739002b617f..b0b2fa18d06790ff41917f46c29002e72974e2d1 100644 (file)
--- a/BUGS
+++ b/BUGS
@@ -1,2 +1,2 @@
 Bugs are managed in our trac system:
-http://www.toastfreeware.priv.at/confclerk
+https://www.toastfreeware.priv.at/confclerk
index 33d67e6d29f7bf7e2c6773a0067051bdc845e03f..fd8df984f803936930699ac479ff6229b3281c18 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,83 @@
+2021-07-30  gregor herrmann  <gregor@toastfreeware.priv.at>
+
+       bump version from (unreleased) 0.6.5 to 0.7.0
+       because new features (cf. 'semver')
+
+       Update NEWS before release.
+
+       Use HTTPS in BUGS file.
+       (Not that it's usable but still …)
+
+       Add more generated files to .gitignore.
+
+       Clean up #includes.
+       (qtcreator is helpful but only partially.)
+
+       Update URLs of tested instances in README.
+       Remove 404 URLs, use latest conferences.
+
+       Bump copyright years.
+
+2021-07-28  Philipp Spitzer  <philipp@spitzer.priv.at>
+
+       Adjust alarm logic to include UTC offset or displayTimeShift.
+
+       Save adjusted displayTimeShift to database.
+
+       Adjust shown event time when displayTimeShift is set.
+
+       No lonely comma when city is missing.
+
+       Add active conference to application class.
+
+2021-07-21  Philipp Spitzer  <philipp@spitzer.priv.at>
+
+       Exchange "where" and "when" lines in conference dialog.
+
+       Show conference offset in conference dialog and prepare display offset.
+
+       Expose utc_offset and display_time_shift in Conference class.
+
+       Load utc_offset and display_time_shift with conference.
+
+       Parse and store utc_offset.
+
+       Add comment for day_change field in conference table definition.
+
+       Add utc_offset and display_time_shift columns to conference database.
+
+       Add links to XML files.
+
+2021-07-14  Philipp Spitzer  <philipp@spitzer.priv.at>
+
+       Adjust whitespace in if statements.
+
+       Fix typo "favourities" -> "favourites".
+
+       Delete unused variable to avoid a compiler warning.
+
+       Replace QModelIndex::child() to avoid a deprecation warning.
+
+       Replace QFontMetrics::width() with QFontMetrics::horizontalAdvance() to avoid a deprecation warning.
+
+       Replace QHash with QMultiHash to avoid a deprecation warning.
+
+2020-05-01  gregor herrmann  <gregoa@debian.org>
+
+       src/mvc/mvc.pro: add network module.
+       src/mvc/treeview.cpp includes src/app/appsettings.h on Maemo5 which includes
+       QNetworkProxy.
+
+2020-03-09  gregor herrmann  <gregor@toastfreeware.priv.at>
+
+       Update some URLs in the documentation.
+
+       Add appstream metadata file.
+
 2017-12-08  gregor herrmann  <gregor@toastfreeware.priv.at>
 
+       bump version after release
+
        update NEWS before release of version 0.6.4
 
 2017-10-07  gregor herrmann  <gregor@toastfreeware.priv.at>
diff --git a/NEWS b/NEWS
index 4fddcb6b1b870c6c61d78ad4cf1d9f809dc75125..35d0ef957129715942d54caf238befe9aff61ca3 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,18 @@
 This is the NEWS file for ConfClerk. ConfClerk is the successor of
 fosdem-schedule; cf. docs/fosdem-schedule for the historic documentation.
 
+version 0.7.0, 2021-07-30
+* Parse, save and display UTC offset from XML files.
+* Add "display time shift" option.
+  This allows users to show events in a different timezone than the one the
+  conference is in. Useful especially for online conferences during
+  pandemics but also for other situations like travelling.
+* Adjust alarm settings to UTC offset and time shift changes.
+  (Lightly tested on Linux and not tested under Maemo.)
+* Add appstream file.
+* Update URLs in documentation.
+* Cleanups in conference dialog.
+
 version 0.6.4, 2017-12-08
 * Improve proxy dialog and add support for SOCKS5 proxies.
   Thanks to intrigeri for the bug report.
diff --git a/README b/README
index d4736ba8e14ad1360b95f3bde5a0b657d4fcca4d..4ca7dc61df0caa6f871279315a1eecf45a491bd2 100644 (file)
--- a/README
+++ b/README
@@ -24,7 +24,7 @@ See the file ./INSTALL for building and installation instructions, and
 Copyright and License:
 
   Copyright (C) 2010 Ixonos Plc.
-  Copyright (C) 2011-2017, Philipp Spitzer, gregor herrmann, Stefan Strahl
+  Copyright (C) 2011-2021, Philipp Spitzer, gregor herrmann, Stefan Strahl
 
   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
@@ -102,7 +102,7 @@ History:
 ConfClerk started as fosdem-schedule, targeted at Maemo as an operating
 system and the FOSDEM conference.
 fosdem-schedule was written by Ixonos Plc., maintained at
-http://sourceforge.net/projects/fosdem-maemo/ , and released under the GNU GPL
+https://sourceforge.net/projects/fosdem-maemo/ , and released under the GNU GPL
 2 or later.
 Cf. docs/fosdem-schedule for more information.
 
@@ -110,7 +110,7 @@ ConfClerk is the successor of fosdem-schedule, aiming at improvements and
 generalization regarding supported platforms and conference systems.
 The project was started after fosdem-schedule was not actively developped
 anymore and with the "blessing" of the fosdem-schedule developers; cf.
-http://sourceforge.net/mailarchive/forum.php?thread_name=20110621171440.GA4521%40nerys.comodo.priv.at&forum_name=fosdem-maemo-devel
+https://sourceforge.net/mailarchive/forum.php?thread_name=20110621171440.GA4521%40nerys.comodo.priv.at&forum_name=fosdem-maemo-devel
 Thanks guys!
 
 
@@ -119,16 +119,20 @@ Contact:
 Philipp Spitzer, gregor herrmann, Stefan Strahl
 Toastfreeware
 <toast+confclerk@toastfreeware.priv.at>
-http://www.toastfreeware.priv.at/confclerk/
+https://www.toastfreeware.priv.at/confclerk/
+
+
+XML "Specification":
+
+https://github.com/voc/schedule/blob/master/validator/xsd/schedule.xml.xsd
 
 
 Tested pentabarf (or frab, or summit/wafer with patches) instances:
 
-- 33C3: https://fahrplan.events.ccc.de/congress/2016/Fahrplan/schedule.xml
-- DebConf (2013, pentbarf): https://penta.debconf.org/dc13_schedule/schedule.en.xml
-- DebConf (2014, summit): https://summit.debconf.org/debconf14.xml
+- 36C3: https://fahrplan.events.ccc.de/congress/2019/Fahrplan/schedule.xml
+- RC3: https://fahrplan.events.ccc.de/rc3/2020/Fahrplan/schedule.xml
 - DebConf (2015, summit): https://summit.debconf.org/debconf15.xml
-- DebConf (2016, wafer): https://debconf16.debconf.org/schedule/pentabarf.xml
-- FOSDEM: http://fosdem.org/schedule/xml
-- FrOSCon (2016): http://programm.froscon.org/2016/schedule.xml
-- Grazer Linuxtage (2016): https://glt16-programm.linuxtage.at/schedule.xml
+- DebConf (2021, wafer): https://debconf21.debconf.org/schedule/pentabarf.xml
+- FOSDEM: https://fosdem.org/schedule/xml
+- FrOSCon (2020): https://programm.froscon.org/2020/schedule.xml
+- Grazer Linuxtage (2018): https://glt18-programm.linuxtage.at/schedule.xml
diff --git a/data/at.priv.toastfreeware.confclerk.metainfo.xml b/data/at.priv.toastfreeware.confclerk.metainfo.xml
new file mode 100644 (file)
index 0000000..9f364e8
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component type="desktop-application">
+  <id>at.priv.toastfreeware.confclerk</id>
+  <name>ConfClerk</name>
+  <summary>offline conference schedule application</summary>
+  <metadata_license>FSFAP</metadata_license>
+  <project_license>GPL-2.0+</project_license>
+  <description>
+    <p>
+    ConfClerk is an application written in Qt, which makes conference schedules available offline. It displays the conference schedule from various views, support searches on various items (speaker, speech topic, location, etc.) and enables you to select favorite events and create your own schedule.
+    </p>
+    <p>
+    At the moment ConfClerk is able to import schedules in XML format created by the PentaBarf conference management system (or frab) used by e.g. FOSDEM, DebConf, FrOSCon, Grazer LinuxTage, and the CCC congresses.
+    </p>
+    <p>
+    ConfClerk is targeted at mobile devices but works on any system running Qt.
+  </p>
+  </description>
+  <launchable type="desktop-id">confclerk.desktop</launchable>
+  <screenshots>
+    <screenshot type="default">
+      <image>https://www.toastfreeware.priv.at/confclerk/attachment/wiki/WikiStart/2013-01-28-175815_517x502_scrot.png</image>
+    </screenshot>
+  </screenshots>
+  <url type="homepage">https://www.toastfreeware.priv.at/confclerk</url>
+</component>
index d616506cee3345dfb1ef65973259869faab4bc4c..75144ff7cf1dd3939d488f7d401a199924b08a32 100644 (file)
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35)
+.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40)
 .\"
 .\" Standard preamble:
 .\" ========================================================================
 .\" Avoid warning from groff about undefined register 'F'.
 .de IX
 ..
-.if !\nF .nr F 0
-.if \nF>0 \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+.    if \nF \{\
+.        de IX
+.        tm Index:\\$1\t\\n%\t"\\$2"
 ..
-.    if !\nF==2 \{\
-.        nr % 0
-.        nr F 2
+.        if !\nF==2 \{\
+.            nr % 0
+.            nr F 2
+.        \}
 .    \}
 .\}
+.rr rF
 .\" ========================================================================
 .\"
 .IX Title "CONFCLERK 1"
-.TH CONFCLERK 1 "2017-08-30" "Version 0.6.4" "Offline conference scheduler"
+.TH CONFCLERK 1 "2021-07-29" "Version 0.7.0" "Offline conference scheduler"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
@@ -109,11 +113,11 @@ In the registry (search for the Toastfreeware key, should be at
 .IP "Other \s-1OS\s0" 4
 .IX Item "Other OS"
 Cf. the QSettings documentation at 
-<http://doc.qt.nokia.com/stable/qsettings.html#locations\-where\-application\-settings\-are\-stored>.
+<https://doc.qt.io/qt\-5/qsettings.html#platform\-specific\-notes>.
 .SH "FILES"
 .IX Header "FILES"
 \&\fBConfClerk\fR keeps its database in the location proposed by the \s-1XDG\s0 Base
-Directory specification <http://standards.freedesktop.org/basedir\-spec/basedir\-spec\-latest.html>:
+Directory specification <https://standards.freedesktop.org/basedir\-spec/basedir\-spec\-latest.html>:
 .PP
 So the configuration (see \*(L"\s-1CONFIGURATION\*(R"\s0) is stored at
 \&\fI~/.config/Toastfreeware/ConfClerk.conf\fR and the database is kept at
@@ -125,9 +129,9 @@ So the configuration (see \*(L"\s-1CONFIGURATION\*(R"\s0) is stored at
 .IX Subsection "Main code"
 .Vb 4
 \&    Copyright (C) 2010 Ixonos Plc.
-\&    Copyright (C) 2011\-2017, Philipp Spitzer <philipp@toastfreeware.priv.at>
-\&    Copyright (C) 2011\-2017, gregor herrmann <gregor@toastfreeware.priv.at>
-\&    Copyright (C) 2011\-2017, Stefan Strahl <stefan@toastfreeware.priv.at>
+\&    Copyright (C) 2011\-2021, Philipp Spitzer <philipp@toastfreeware.priv.at>
+\&    Copyright (C) 2011\-2021, gregor herrmann <gregor@toastfreeware.priv.at>
+\&    Copyright (C) 2011\-2021, Stefan Strahl <stefan@toastfreeware.priv.at>
 \&
 \&    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
index 16411cece7a3bc3ce99f1c1554200b264abbc05d..5cca88eee06209c57d2c61a99bbf59778cbb35aa 100644 (file)
Binary files a/data/confclerk.png and b/data/confclerk.png differ
index 6c16b969a3e942f1625f2995b046668124ddefa9..12346848797e0c4df925cb81db74c435195311d7 100644 (file)
@@ -47,14 +47,14 @@ F<HKEY_CURRENT_USER\Software\Toastfreeware\ConfClerk>).
 =item Other OS
 
 Cf. the QSettings documentation at 
-L<http://doc.qt.nokia.com/stable/qsettings.html#locations-where-application-settings-are-stored>.
+L<https://doc.qt.io/qt-5/qsettings.html#platform-specific-notes>.
 
 =back
 
 =head1 FILES
 
 B<ConfClerk> keeps its database in the location proposed by the XDG Base
-Directory specification L<http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html>:
+Directory specification L<https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html>:
 
 So the configuration (see L</"CONFIGURATION">) is stored at
 F<~/.config/Toastfreeware/ConfClerk.conf> and the database is kept at
@@ -66,9 +66,9 @@ F<~/.local/share/Toastfreeware/ConfClerk/ConfClerk.sqlite> (Qt5).
 =head2 Main code
 
     Copyright (C) 2010 Ixonos Plc.
-    Copyright (C) 2011-2017, Philipp Spitzer <philipp@toastfreeware.priv.at>
-    Copyright (C) 2011-2017, gregor herrmann <gregor@toastfreeware.priv.at>
-    Copyright (C) 2011-2017, Stefan Strahl <stefan@toastfreeware.priv.at>
+    Copyright (C) 2011-2021, Philipp Spitzer <philipp@toastfreeware.priv.at>
+    Copyright (C) 2011-2021, gregor herrmann <gregor@toastfreeware.priv.at>
+    Copyright (C) 2011-2021, Stefan Strahl <stefan@toastfreeware.priv.at>
 
     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
index 69c38a7bee5b2090d2297a22dcf89805cd62040b..7da11b5b467d3b2252bbe981bc55c39562d869b3 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 6620d74ba91211fad0f8ef513b823acdcbb7ba42..93388d1bcfa46cc311a7e244cfbcb7a1909a7c78 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 386b681a0389d1b4d6a7e554af4eee4f903fa114..3a125a11f1b382ff8e22e4645c905a8a09940883 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 53727dbe891658a896b195a5a38e14d34c162b60..2f4e1c2ea43c791cfdec8d3529c0368cdb32eae1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
 #define APPLICATION_H
 
 #include <QApplication>
+#include "conference.h"
 
 class Application : public QApplication
 {
     Q_OBJECT
 
 public:
-    Application(int& argc, char** argv)
-    : QApplication(argc, argv)
-    { }
-    virtual ~Application() { }
+    Application(int& argc, char** argv): QApplication(argc, argv) {}
+    virtual ~Application() {}
 
     virtual bool notify(QObject* receiver, QEvent* event);
+
+    void setActiveConference(Conference& conference) {mActiveConference = conference; mHasActiveConference = true;}
+    void unsetActiveConference() {mHasActiveConference = false;}
+    Conference& activeConference() {return mActiveConference;}
+    bool hasActiveConference() const {return mHasActiveConference;}
+
+private:
+    bool mHasActiveConference = false;
+    Conference mActiveConference;
 };
 
 #endif
index f92c17e9b87d92943d554ea31da0861f626699e2..f21e17b3d4e2ce357695d497d809cb6393325ba7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index f116f18c2f6c22a868265ff7a700d5d39d4fe83c..439d8965fc80c42601f11bb0e063e895389b822b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 3c6f24ae9f2c21bdfce661e8c2ab6a7a691302bb..45250a542986da19e2d7919354f89657e9b41d39 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index faa1eac959bd397df6b41cd1f928bb7a9797026b..705c9348b361aa99de6eaff1e88c3e6295cbd1e7 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE RCC><RCC version="1.0">
 <qresource>
-    <file>dbschema001.sql</file>
     <file>dbschema000to001.sql</file>
+    <file>dbschema001to002.sql</file>
+    <file>dbschema002.sql</file>
 </qresource>
 </RCC>
-
diff --git a/src/dbschema001to002.sql b/src/dbschema001to002.sql
new file mode 100644 (file)
index 0000000..e497928
--- /dev/null
@@ -0,0 +1,9 @@
+BEGIN TRANSACTION;
+
+ALTER TABLE conference ADD COLUMN utc_offset INTEGER DEFAULT NULL;
+ALTER TABLE conference ADD COLUMN display_time_shift INTEGER DEFAULT NULL;
+
+PRAGMA user_version=2;
+
+COMMIT;
+
diff --git a/src/dbschema002.sql b/src/dbschema002.sql
new file mode 100644 (file)
index 0000000..d933761
--- /dev/null
@@ -0,0 +1,92 @@
+BEGIN TRANSACTION;
+
+CREATE TABLE conference (
+       id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+       title VARCHAR NOT NULL,
+       subtitle VARCHAR,
+       venue VARCHAR,
+       city VARCHAR,
+       start INTEGER NOT NULL, -- timezone-less timestamp (Unix Epoch)
+       end INTEGER NOT NULL,   -- timezone-less timestamp (Unix Epoch)
+       day_change INTEGER, -- in seconds after midnight
+       timeslot_duration INTEGER,
+       utc_offset INTEGER DEFAULT NULL, -- if known, conference UTC offset in seconds (e.g. CET = +3600)
+       display_time_shift INTEGER DEFAULT NULL, -- if not null, add number in seconds to conference times when showing times
+       active INTEGER DEFAULT 0,
+       url VARCHAR
+);
+
+CREATE TABLE track (
+       id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+       xid_conference INTEGER NOT NULL REFERENCES conference(id),
+       name VARCHAR NOT NULL,
+       UNIQUE (xid_conference, name)
+);
+
+CREATE TABLE room (
+       id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+       xid_conference INTEGER NOT NULL REFERENCES conference(id),
+       name VARCHAR NOT NULL,
+       picture VARCHAR,
+       UNIQUE (xid_conference, name)
+);
+
+CREATE TABLE person (
+       id INTEGER NOT NULL,
+       xid_conference INTEGER NOT NULL REFERENCES conference(id),
+       name VARCHAR NOT NULL,
+       PRIMARY KEY (id, xid_conference)
+); 
+
+CREATE TABLE event (
+       xid_conference INTEGER NOT NULL REFERENCES conference(id),
+       id INTEGER NOT NULL,
+       start INTEGER NOT NULL,    -- timezone-less timestamp (Unix Epoch)
+       duration INTEGER NOT NULL, -- duration of the event in seconds
+       xid_track INTEGER NOT NULL REFERENCES track(id),
+       type VARCHAR,
+       language VARCHAR,
+       tag VARCHAR,
+       title VARCHAR NOT NULL,
+       subtitle VARCHAR,
+       abstract VARCHAR,
+       description VARCHAR,
+       favourite INTEGER DEFAULT 0, -- 0 ... no favourite, 1 ... strong favourite, 2 ... weak favourite/alternative to strong favourite
+       alarm INTEGER DEFAULT 0,
+       PRIMARY KEY (xid_conference, id)
+);
+
+CREATE TABLE event_person (
+       xid_conference INTEGER NOT NULL,
+       xid_event INTEGER NOT NULL,
+       xid_person INTEGER NOT NULL,
+       UNIQUE (xid_conference, xid_event, xid_person ) ON CONFLICT REPLACE,
+       FOREIGN KEY(xid_conference) REFERENCES conference(id),
+       FOREIGN KEY(xid_conference, xid_event) REFERENCES event(xid_conference, id),
+       FOREIGN KEY(xid_conference, xid_person) REFERENCES person(xid_conference, id)
+);
+
+CREATE TABLE event_room (
+       xid_conference INTEGER NOT NULL,
+       xid_event INTEGER NOT NULL,
+       xid_room INTEGER NOT NULL,
+       UNIQUE (xid_conference, xid_event, xid_room) ON CONFLICT REPLACE,
+       FOREIGN KEY(xid_conference) REFERENCES conference(id),
+       FOREIGN KEY(xid_conference, xid_event) REFERENCES event(xid_conference, id),
+       FOREIGN KEY(xid_conference, xid_room) REFERENCES room(xid_conference, id)
+);
+
+CREATE TABLE link (
+       id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+       xid_conference INTEGER NOT NULL,
+       xid_event INTEGER NOT NULL,
+       name VARCHAR,
+       url VARCHAR NOT NULL,
+       UNIQUE (xid_conference, xid_event , url) ON CONFLICT REPLACE,
+       FOREIGN KEY(xid_conference) REFERENCES conference(id),
+       FOREIGN KEY(xid_conference, xid_event) REFERENCES event(xid_conference, id)
+);
+
+PRAGMA user_version=2;
+
+COMMIT;
index 27e691453aa9ec2330803dd7a60248d4267d5cfe..337b841853e7de5eb8b389eae36690563df2729b 100644 (file)
@@ -4,7 +4,7 @@
 # USAGE: include(./global.pri)
 
 # VERSION
-VERSION = 0.6.4
+VERSION = 0.7.0
 DEFINES += VERSION=\\\"$$VERSION\\\"
 
 # Define 'MAEMO' specific CONFIG/DEFINE
index 62225977b6ca0bb561b2b70057138b2ed0a21020..e2f6b3593d1305e066aa86ce99717e9154ca0434 100644 (file)
@@ -137,7 +137,7 @@ p, li { white-space: pre-wrap; }
 &lt;p style=&quot; margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:x-large; font-weight:600;&quot;&gt;Copyright and license&lt;/span&gt;&lt;/p&gt;
 &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;ConfClerk 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, or (at your option) any later version.&lt;/p&gt;
 &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;ConfClerk is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.&lt;/p&gt;
-&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Copyright (C) 2010 Ixonos Plc.&lt;br /&gt;Copyright (C) 2011-2017 Philipp Spitzer &amp;amp; gregor herrmann &amp;amp; Stefan Strahl&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Copyright (C) 2010 Ixonos Plc.&lt;br /&gt;Copyright (C) 2011-2021 Philipp Spitzer &amp;amp; gregor herrmann &amp;amp; Stefan Strahl&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
          </property>
          <property name="textFormat">
           <enum>Qt::RichText</enum>
index e1328496c2ab1b1385affa8d41fdbc6a83e64b8f..927a2f866a8d82ddf93762440572baf6c2293c3e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -50,6 +50,8 @@ ConferenceEditor::ConferenceEditor(ConferenceModel* model, QWidget* parent)
     connect(changeUrl, SIGNAL(clicked()), SLOT(changeUrlClicked()));
     connect(refreshBtn, SIGNAL(clicked()), SLOT(refreshClicked()));
     connect(buttonBox, SIGNAL(rejected()), SLOT(close()));
+    connect(conferenceDtsHours, SIGNAL(valueChanged(int)), SLOT(dtsChanged()));
+    connect(conferenceDtsMinutes, SIGNAL(valueChanged(int)), SLOT(dtsChanged()));
 
     // it's OK to emit selection signals here
     // because they are not yet connected to anybody
@@ -89,11 +91,22 @@ void ConferenceEditor::itemSelected(const QModelIndex& current, const QModelInde
 
         conferenceTitle->setText(conf.title());
         conferenceSubtitle->setText(conf.subtitle());
-        conferenceWhere->setText(conf.city() + (!conf.venue().isEmpty() ? ", " + conf.venue() : ""));
+        QString where = conf.city();
+        if (!conf.city().isEmpty() && !conf.venue().isEmpty()) where += ", ";
+        where += conf.venue();
+        conferenceWhere->setText(where);
         conferenceWhen->setText(
                 conf.start().toString("yyyy-MM-dd")
                 + " - " +
                 conf.end().toString("yyyy-MM-dd"));
+        if (conf.hasUtcOffset()) {
+            conferenceUtcOffset->setText(QString::number(conf.utcOffset()) + " min");
+        } else {
+            conferenceUtcOffset->setText("N/A");
+        }
+        int dts = conf.displayTimeShift();
+        conferenceDtsHours->setValue(dts / 60);
+        conferenceDtsMinutes->setValue(abs(dts) % 60);
         conferenceInfo->setCurrentIndex(0);
         removeBtn->show();
     }
@@ -160,6 +173,14 @@ void ConferenceEditor::refreshClicked()
     emit haveConferenceUrl(url, selected_id);
 }
 
+void ConferenceEditor::dtsChanged() {
+    if (selected_id < 0) return;
+    Conference& conference = model->conferenceFromIndex(model->indexFromId(selected_id));
+    int minutes = conferenceDtsMinutes->value();
+    if (conferenceDtsHours->value() < 0) minutes *= -1;
+    conference.setDisplayTimeShift(conferenceDtsHours->value() * 60 + minutes);
+}
+
 void ConferenceEditor::importStarted()
 {
     addBtn->hide();
index 00d6ae1fa024e3bdcec7d656d4507654f45e813a..903454a09fb5e0e07865d2f612793fd7d8b17f93 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -64,6 +64,7 @@ private slots:
     void removeClicked();
     void changeUrlClicked();
     void refreshClicked();
+    void dtsChanged();
 
 private:
     ConferenceModel* model;
index 3c1c602e1b48d8e06985b9a211250639fccf7866..1bb2387cb1cbdb99b7834ef92b3662b417d970f8 100644 (file)
@@ -14,7 +14,7 @@
    <string>Edit Conferences</string>
   </property>
   <property name="windowIcon">
-   <iconset resource="../../data/data.qrc">
+   <iconset>
     <normaloff>:/confclerk.svg</normaloff>:/confclerk.svg</iconset>
   </property>
   <layout class="QHBoxLayout" name="horizontalLayout_4">
       <item>
        <widget class="QWidget" name="buttons" native="true">
         <layout class="QHBoxLayout" name="horizontalLayout_2">
-         <property name="margin">
+         <property name="leftMargin">
+          <number>0</number>
+         </property>
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="rightMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
           <number>0</number>
          </property>
          <item>
@@ -39,7 +48,7 @@
             <string notr="true"/>
            </property>
            <property name="icon">
-            <iconset resource="../icons.qrc">
+            <iconset>
              <normaloff>:/icons/add.png</normaloff>:/icons/add.png</iconset>
            </property>
           </widget>
@@ -56,7 +65,7 @@
             <string notr="true"/>
            </property>
            <property name="icon">
-            <iconset resource="../icons.qrc">
+            <iconset>
              <normaloff>:/icons/remove.png</normaloff>:/icons/remove.png</iconset>
            </property>
           </widget>
          </item>
          <item>
           <layout class="QGridLayout" name="gridLayout_7">
-           <item row="0" column="0">
-            <widget class="QLabel" name="label_3">
+           <item row="2" column="0">
+            <widget class="QLabel" name="label">
              <property name="font">
               <font>
                <weight>75</weight>
               </font>
              </property>
              <property name="text">
-              <string>When:</string>
+              <string>UTC offset:</string>
              </property>
             </widget>
            </item>
-           <item row="1" column="0">
-            <widget class="QLabel" name="label_4">
+           <item row="2" column="1">
+            <widget class="QLabel" name="conferenceUtcOffset">
+             <property name="text">
+              <string>N/A</string>
+             </property>
+            </widget>
+           </item>
+           <item row="3" column="0">
+            <widget class="QLabel" name="label_5">
              <property name="font">
               <font>
                <weight>75</weight>
               </font>
              </property>
              <property name="text">
-              <string>Where:</string>
+              <string>Display time shift:</string>
              </property>
             </widget>
            </item>
+           <item row="3" column="1">
+            <layout class="QHBoxLayout" name="horizontalLayout">
+             <item>
+              <widget class="QSpinBox" name="conferenceDtsHours">
+               <property name="toolTip">
+                <string>hour</string>
+               </property>
+               <property name="suffix">
+                <string> H</string>
+               </property>
+               <property name="minimum">
+                <number>-14</number>
+               </property>
+               <property name="maximum">
+                <number>14</number>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QSpinBox" name="conferenceDtsMinutes">
+               <property name="toolTip">
+                <string>minutes</string>
+               </property>
+               <property name="suffix">
+                <string> M</string>
+               </property>
+               <property name="maximum">
+                <number>59</number>
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </item>
            <item row="0" column="1">
+            <widget class="QLabel" name="conferenceWhere">
+             <property name="text">
+              <string>CITY, CAMPUS</string>
+             </property>
+            </widget>
+           </item>
+           <item row="1" column="1">
             <widget class="QLabel" name="conferenceWhen">
              <property name="text">
               <string>DATE (FROM - TO)</string>
              </property>
             </widget>
            </item>
-           <item row="1" column="1">
-            <widget class="QLabel" name="conferenceWhere">
+           <item row="1" column="0">
+            <widget class="QLabel" name="label_3">
+             <property name="font">
+              <font>
+               <weight>75</weight>
+               <italic>true</italic>
+               <bold>true</bold>
+              </font>
+             </property>
              <property name="text">
-              <string>CITY, CAMPUS</string>
+              <string>When:</string>
+             </property>
+            </widget>
+           </item>
+           <item row="0" column="0">
+            <widget class="QLabel" name="label_4">
+             <property name="font">
+              <font>
+               <weight>75</weight>
+               <italic>true</italic>
+               <bold>true</bold>
+              </font>
+             </property>
+             <property name="text">
+              <string>Where:</string>
              </property>
             </widget>
            </item>
               <string>Reload from URL</string>
              </property>
              <property name="icon">
-              <iconset resource="../icons.qrc">
+              <iconset>
                <normaloff>:/icons/reload.png</normaloff>:/icons/reload.png</iconset>
              </property>
             </widget>
    </item>
   </layout>
  </widget>
- <resources>
-  <include location="../../data/data.qrc"/>
-  <include location="../icons.qrc"/>
- </resources>
+ <tabstops>
+  <tabstop>confView</tabstop>
+  <tabstop>addBtn</tabstop>
+  <tabstop>removeBtn</tabstop>
+  <tabstop>conferenceDtsHours</tabstop>
+  <tabstop>conferenceDtsMinutes</tabstop>
+  <tabstop>refreshBtn</tabstop>
+  <tabstop>changeUrl</tabstop>
+ </tabstops>
+ <resources/>
  <connections/>
 </ui>
index 474690c4ac4529a16fb9f24f7f29c7b9d4bdb49f..b1b88ead9d05ada17ca7c7fbd1bac6580e1e8169 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index bb621cf70d899b11e3e32e262b89c9a60d9fb1d2..9adbbfefb74245da80cbae3d53cf132f17831fb7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index e149a879d280d5e8b0d67cdf5584debf9e05275c..d467c9a5402e4833e32fb43bc8788461c0230df9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 1725ef94d3c9434c693b5643552061e396b7f6bc..33a49791a780a2c02d40dbc2f7b788bfb47f5ac1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 0aa3a8401d945cd4a997469af8eb3fc1fc92ae8d..dcda38f327f7c8284133682d2fa3acd68a2d6932 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
  * You should have received a copy of the GNU General Public License along with
  * ConfClerk.  If not, see <http://www.gnu.org/licenses/>.
  */
-#include "daynavigatorwidget.h"
 
 #include <QPainter>
 #include <QLabel>
 
+#include "daynavigatorwidget.h"
+#include "conference.h"
+#include "application.h"
+
 
 DayNavigatorWidget::DayNavigatorWidget(QWidget *aParent): QWidget(aParent) {
     setupUi(this);    
@@ -107,8 +110,22 @@ void DayNavigatorWidget::nextDayButtonClicked() {
 
 void DayNavigatorWidget::paintEvent(QPaintEvent *aEvent) {
     Q_UNUSED(aEvent);
-
-    QString selectedDateStr = mCurDate.isValid() ? mCurDate.toString("dddd\nyyyy-MM-dd") : tr("No date");
+    QString selectedDateStr;
+    if (mCurDate.isValid()) {
+        selectedDateStr = mCurDate.toString("dddd\nyyyy-MM-dd");
+        bool hasConference = ((Application*) qApp)->hasActiveConference();
+        if (hasConference) {
+            Conference& conference = ((Application*) qApp)->activeConference();
+            if (conference.hasDisplayTimeShift() && conference.displayTimeShift() != 0) {
+                QTime shift(0, 0);
+                bool minus = conference.displayTimeShift() < 0;
+                shift = shift.addSecs(conference.displayTimeShift() * 60 * (minus ? -1 : 1));
+                selectedDateStr += " (" + (minus ? QString("-") : "+") + shift.toString("HH:mm") + ")";
+            }
+        }
+    } else {
+        selectedDateStr = tr("No date");
+    }
     QPainter painter(this);
     painter.save();
 
@@ -121,7 +138,12 @@ void DayNavigatorWidget::paintEvent(QPaintEvent *aEvent) {
 #ifdef MAEMO
     qreal factor = 0.8;
 #else
-    qreal factor = (qreal) 2 * q.width() / painter.fontMetrics().width(selectedDateStr);
+#if QT_VERSION >= 0x050b00 // QT 5.11
+    auto dateStrWidth = painter.fontMetrics().horizontalAdvance(selectedDateStr);
+#else
+    auto dateStrWidth = painter.fontMetrics().width(selectedDateStr);
+#endif
+    qreal factor = (qreal) 2 * q.width() / dateStrWidth;
 #endif
     if (factor < 1) f.setPointSizeF(f.pointSizeF() * factor);
     painter.setFont(f);
index 8fb9de9034932b66614d7a24a107f3e3be245242..c89360556e08116350a18db8169d5197ec4d7cb7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 6a190d9d44a6dc73481a083bfc7dd79d012e5532..8b067164fee321dfc0a0cf0f67e70de9f760a184 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 422158551271506325f4c7697cfa3b30a555dfc1..46fba702976a7b0c1400f8b57d606fee03b929f9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 26cebd3055fa54244150f9beaba253667f14e8be..40df3a70aa0dd8c12f94f76b307bc91f1cbfc1e0 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index a565747a29275e525338188bb4b627fc13c406be..060c736edbecb1d9c7393cd2bf4d54e990697221 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 6f3014e63a5bdf210a550474f3549fa694c1e559..38d42ddbf379fd351269cd463be42cc132fa19c1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 6d0e27518b78596f34540ae1ed0871d35ac1179d..5d16da49ae6744a56e5dc140a2d76aa8951d8a8d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index bad98d1568ac03c69d26b7bab0e6cca2f0d094f7..0bad0085e0ba154bdaf1704b05ff697e84aa16ec 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 5b9315be960857950cf5e852b21c42ee5fcdcf35..dbe0e350a7c7c31992a301bae7c5a24b2409743d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 918134382b7caaaa0661c9c3c9c49f2aed5d23f1..6d74823fed3ed8068de66706fcff4994fce4051a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
 #include <QNetworkAccessManager>
 #include <QNetworkReply>
 #include <QSslConfiguration>
+#include <QDialog>
+#include <QMessageBox>
 
 #include "sqlengine.h"
-
 #include "track.h"
 #include "eventmodel.h"
 #include "delegate.h"
 #include "room.h"
-
 #include "conference.h"
-
-#include <QDialog>
-#include <QMessageBox>
-
 #include "ui_about.h"
 #include "eventdialog.h"
 #include "daynavigatorwidget.h"
@@ -45,9 +41,9 @@
 #include "conferenceeditor.h"
 #include "schedulexmlparser.h"
 #include "errormessage.h"
-
 #include "tabcontainer.h"
 #include "appsettings.h"
+#include "application.h"
 
 MainWindow::MainWindow(QWidget* parent): QMainWindow(parent) {
     setupUi(this);
@@ -238,22 +234,24 @@ void MainWindow::onSystemTrayMessageClicked() {
 
 void MainWindow::onAlarmTimerTimeout() {
     // determine if an alarm is set on an event that's starting soon
-    QList<Event> events = Event::getImminentAlarmEvents(AppSettings::preEventAlarmSec(), Conference::activeConference());
+    int conferenceId = Conference::activeConference();
+    QList<Event> events = Event::getImminentAlarmEvents(AppSettings::preEventAlarmSec(), conferenceId);
     if (events.empty()) return;
 
     // build a message string
+    const Conference conference = Conference::getById(conferenceId);
     Event event;
     QString title;
     QString message;
     if (events.size() == 1) {
         event = events.first();
-        title = tr("Next event at %1").arg(event.start().toString("HH:mm"));
+        title = tr("Next event at %1").arg(conference.shiftTime(event.start().time()).toString("HH:mm"));
         message = tr("\"%1\"\n(%2)").arg(event.title()).arg(event.room()->name());
     } else {
         title = tr("%1 upcoming events").arg(events.size());
         QStringList messages;
         foreach (event, events) {
-            messages += tr("%1: \"%2\" (%3)").arg(event.start().toString("HH:mm")).arg(event.title()).arg(event.room()->name());
+            messages += tr("%1: \"%2\" (%3)").arg(conference.shiftTime(event.start().time()).toString("HH:mm")).arg(event.title()).arg(event.room()->name());
         }
         message = messages.join("\n");
     }
@@ -322,6 +320,7 @@ void MainWindow::initTabs()
     if (confId != -1)   // only init tabs if a conference is active
     {
         Conference active = Conference::getById(confId);
+        ((Application*) qApp)->setActiveConference(active);
         QDate startDate = active.start();
         QDate endDate = active.end();
 
@@ -345,6 +344,7 @@ void MainWindow::unsetConference()
     clearTabs();
     dayNavigator->unsetDates();
     setWindowTitle(saved_title);
+    ((Application*) qApp)->unsetActiveConference();
 }
 
 
index 91b3c114e5b1490474e8a08a0ae43853205c6f7d..4a7f2a7133a72aa67f190aee8711cd5c40ec47ee 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index a5428f6bd28e95832ce7ae04fc1ed61903ae772d..df11adcdac948135758e00c4148025f0b05aaf73 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index b17992de55e55e6cec985f95384a214fde22c8fe..93b5f57ccd4ad200fef9456dfa26197b4f1a2af4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 51f8c29b799bca474b1eb1f3bfccb4e9d9f84405..8bec0c68355e794dc629bc1b1523bd124a9deab7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 39303f00d77064a7be7093342ea23d43b2c1e4c3..9df49e2ad3f164bc05a3c7c11fca3e406a76b652 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 8b59153ec348274f381e1b63b70985ee41ce99c9..443fbbc13f0f77f806ca1885d0bb56403d8970e9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -60,19 +60,19 @@ void SearchTabContainer::showSearchDialog(bool show) {
 void SearchTabContainer::searchButtonClicked() {
     if (!sqlEngine) return;
 
-    QHash<QString,QString> columns;
+    QMultiHash<QString,QString> columns;
 
     SearchHead *searchHeader = static_cast<SearchHead*>(header);
-    if( searchHeader->searchTitle->isChecked() )
-        columns.insertMulti("EVENT", "title");
-    if( searchHeader->searchAbstract->isChecked() )
-        columns.insertMulti("EVENT", "abstract");
-    if( searchHeader->searchTag->isChecked() )
-        columns.insertMulti("EVENT", "tag");
-    if( searchHeader->searchSpeaker->isChecked() )
-        columns["PERSON"] = "name";
-    if( searchHeader->searchRoom->isChecked() )
-        columns["ROOM"] = "name";
+    if (searchHeader->searchTitle->isChecked())
+        columns.insert("EVENT", "title");
+    if (searchHeader->searchAbstract->isChecked())
+        columns.insert("EVENT", "abstract");
+    if (searchHeader->searchTag->isChecked())
+        columns.insert("EVENT", "tag");
+    if (searchHeader->searchSpeaker->isChecked())
+        columns.insert("PERSON", "name");
+    if (searchHeader->searchRoom->isChecked())
+        columns.insert("ROOM", "name");
 
     QString keyword = searchHeader->searchEdit->text();
 
index 101c66b21a191357745fce7830db5507f741f8fa..dede9d8c3e7392ef0d759e132456d137ed517e58 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 0262d91935b119a3c8902a741c60038f41cdb1f6..29dc739eecd1cdc6351f3a4fc165db14742fd6cd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 368b3caa5f88dc967f4adb11eafbd5d6ac9a3b5d..14bc912c1917a74206efd24b00bb62e4a9466d54 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 56338b4815bd1683a2849a3671616a2d7f831b03..84aa4a68dfd630573bd64614437fcacf63057a8a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 92372c47e4cd31be0402065d92781321ee6d42c4..12d21a99939f70da9f19048febbcf26eac50c952 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 23617377675cdea03af2971c4dece4aad5801a4f..399c7a3762e005199619db61b2fecb984917eef3 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 930411ccd243c4e7130834479390dc1e5fd2c5b3..cdc0054953244be884672b216b0f497c32406dc5 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 61e62dc8d0a4546e098dc09bd1b14b66ffbb1039..2bc15f5b2448de373c4805b6f2e33c5081dbdd14 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 9b4b9885c2be6d9c4c237c8f3330c50f43431ef2..c132ae909f3d40b8214bffb5376c762d5b395371 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index f3e90b26af5385aa935494bc65bc43fc03e5ac73..7f95a504ed621296ccca423a69b009a47a65398e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -30,6 +30,8 @@ QSqlRecord const Conference::sColumns = Conference::toRecord(QList<QSqlField>()
     << QSqlField("end", QVariant::DateTime)
     << QSqlField("day_change", QVariant::Int)
     << QSqlField("timeslot_duration", QVariant::Int)
+    << QSqlField("utc_offset", QVariant::Int)
+    << QSqlField("display_time_shift", QVariant::Int)
     << QSqlField("active", QVariant::Bool)
     << QSqlField("url", QVariant::String)
     );
@@ -58,3 +60,6 @@ int Conference::activeConference() {
 }
 
 
+QTime Conference::shiftTime(const QTime& value) const {
+    return value.addSecs(displayTimeShift() * 60);
+}
index 694fd48b1baca8e0a37d62ab4a5ed5a6a80b3c3f..c2e86577c6506dae1dc2c832aeebfc6ece0fc801 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -51,6 +51,12 @@ public:
     int dayChange() const { return value("day_change").toInt(); } // in seconds from 00:00
     QTime dayChangeTime() const {QTime dayChangeTime(0, 0); return dayChangeTime.addSecs(dayChange());}
     int timeslotDuration() const { return value("timeslot_duration").toInt(); } // in seconds
+    bool hasUtcOffset() const {return !value("utc_offset").isNull();}
+    int utcOffset() const {return value("utc_offset").toInt();}
+    bool hasDisplayTimeShift() const {return !value("display_time_shift").isNull();}
+    int displayTimeShift() const {return value("display_time_shift").toInt();}
+    void setDisplayTimeShift(int newValue) {setValue("display_time_shift", newValue); update("display_time_shift");}
+
     bool isActive() const { return value("active").toBool(); }
     QString url() const { return stringFromNullable(value("url")); }
 
@@ -60,6 +66,9 @@ public:
         update("url");
     }
 
+    /// Returns a QTime that is shifted by displayTimeShift minutes
+    QTime shiftTime(const QTime& value) const;
+
 private:
     static QString stringFromNullable(const QVariant& v)
     {
index c03761cfd96d9c3193d87287600c0217b8264677..a830aca93dc8afa5e5ec2d200a39f7f5117f5f3a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -39,19 +39,21 @@ QVariant ConferenceModel::data(const QModelIndex& index, int role) const
     if (role != Qt::DisplayRole) {
         return QVariant();
     }
-
     return conferences[index.row()].title();
+}
 
-    try {
-        const Conference& c = conferenceFromIndex(index);
-        return c.title();
-    } catch (OrmNoObjectException&) {
-        return QVariant();
+const Conference& ConferenceModel::conferenceFromIndex(const QModelIndex& index) const
+{
+    if (index.parent().isValid()
+        or index.column() != 0
+        or index.row() >= conferences.size())
+    {
+        throw OrmNoObjectException();
     }
-
+    return conferences[index.row()];
 }
 
-const Conference& ConferenceModel::conferenceFromIndex(const QModelIndex& index) const
+Conference& ConferenceModel::conferenceFromIndex(const QModelIndex& index)
 {
     if (index.parent().isValid()
         or index.column() != 0
index b7297ba2c83218a2f2447df376f9596ce572d2cc..4ff9ecdaec58317fa0365088ed47aadf4d92a70c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -29,7 +29,8 @@
 
 It also provides typed access to the conferences from ConferenceEditor.
 
-It does not actually modify anything in DB, this is performed by other classes.
+It does not actually modify anything in DB (unless methods changing the conference instance returned by conferenceFromIndex are used),
+this is performed by other classes.
 
 \see ConferenceEditor, MainWindow::showConferences()
 */
@@ -43,6 +44,7 @@ public:
     virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
 
     const Conference& conferenceFromIndex(const QModelIndex&) const;
+    Conference& conferenceFromIndex(const QModelIndex&);
     QModelIndex indexFromId(int id) const;
 public slots:
     void newConferenceBegin();
index 2d1f08524084873ea61ee03ad94879a50a826960..55bf4c88f10831188f2ad67f51e084371550b306 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
  * You should have received a copy of the GNU General Public License along with
  * ConfClerk.  If not, see <http://www.gnu.org/licenses/>.
  */
-#include "delegate.h"
-#include "eventmodel.h"
-#include "track.h"
-
 #include <QDebug>
 #include <QPainter>
 
+#include "delegate.h"
+#include "eventmodel.h"
+#include "track.h"
+#include "conference.h"
 #include "room.h"
+#include "application.h"
 
-const int RADIUS = 10;
 const int SPACER = 10;
 
 const double scaleFactor1 = 0.4;
@@ -148,7 +148,8 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons
         painter->setPen(QPen(conflictSeverity != csNone ? Qt::black : textColor));
         QPointF titlePointF(option.rect.x() + SPACER,
                             option.rect.y() + SPACER + mControls[FavouriteControlStrong]->image()->height());
-        QTime start = event->start().time();
+        Conference& conference = ((Application*) qApp)->activeConference();
+        QTime start = conference.shiftTime(event->start().time());
         painter->setFont(fontBig);
         painter->drawText(titlePointF,start.toString("hh:mm") + "-" + start.addSecs(event->duration()).toString("hh:mm") + ", " + event->roomName());
 
@@ -185,7 +186,7 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons
 
     else // doesn't have parent - time-groups' elements (top items)
     {
-        int numFav = numberOfFavourities(index);
+        int numFav = numberOfFavourites(index);
         int numAlarm = numberOfAlarms(index);
 
         QStyleOptionButton styleOptionButton;
@@ -356,14 +357,14 @@ bool Delegate::isPointFromRect(const QPoint &aPoint, const QRect &aRect) const
     return false;
 }
 
-int Delegate::numberOfFavourities(const QModelIndex &index) const
+int Delegate::numberOfFavourites(const QModelIndex &index) const
 {
     if(index.parent().isValid()) // it's event, not time-group
         return 0;
 
     int nrofFavs = 0;
     for(int i=0; i<index.model()->rowCount(index); i++)
-        if(static_cast<Event*>(index.child(i,0).internalPointer())->favourite() != Favourite_no)
+        if(static_cast<Event*>(index.model()->index(i, 0, index).internalPointer())->favourite() != Favourite_no)
             nrofFavs++;
 
     return nrofFavs;
@@ -376,7 +377,7 @@ int Delegate::numberOfAlarms(const QModelIndex &index) const
 
     int nrofAlarms = 0;
     for(int i=0; i<index.model()->rowCount(index); i++)
-        if(static_cast<Event*>(index.child(i,0).internalPointer())->hasAlarm())
+        if(static_cast<Event*>(index.model()->index(i, 0, index).internalPointer())->hasAlarm())
             nrofAlarms++;
 
     return nrofAlarms;
index 2ee765f88a077119e6aa5a38e3c93be032f76c07..6ec93e25e0ee9c5337fdd441cb255c929eca3ad6 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -90,10 +90,10 @@ class Delegate : public QItemDelegate
         void defineControls();
         // TODO: the better place for these methods would be 'eventmodel'
         // they are used in 'paint' method and so it's better to obtain number of
-        // favourities/alarms once when the data has changed and not to call
+        // favourites/alarms once when the data has changed and not to call
         // these methods which iterate over all Events in corresponding group
         // every time it requires them
-        int numberOfFavourities(const QModelIndex &index) const;
+        int numberOfFavourites(const QModelIndex &index) const;
         int numberOfAlarms(const QModelIndex &index) const;
 
     private:
index d2075e784e30d6664029128dcf28a2e200b6a209..719b4d91448cfbedfa37bda983a8495b8334ac6c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -103,10 +103,19 @@ QList<Event> Event::conflictEvents(int aEventId, int conferenceId) {
 
 
 QList<Event> Event::getImminentAlarmEvents(int maxSecToAlarm, int conferenceId) {
+    Conference conference = Conference::getById(conferenceId);
     QSqlQuery query;
     query.prepare(selectQuery() + "WHERE xid_conference = :conf AND (start < :start AND alarm = 1) ORDER BY start, duration");
     query.bindValue(":conf", conferenceId);
-    query.bindValue(":start", convertToDb(QDateTime::currentDateTime().addSecs(maxSecToAlarm), QVariant::DateTime));
+    QDateTime start;
+    if (conference.hasUtcOffset()) {
+        start = QDateTime::currentDateTimeUtc().addSecs(conference.utcOffset() * 60);
+    } else {
+        start = QDateTime::currentDateTime();
+        if (conference.hasDisplayTimeShift()) start = start.addSecs(conference.displayTimeShift() * 60);
+    }
+    start = start.addSecs(maxSecToAlarm);
+    query.bindValue(":start", convertToDb(start, QVariant::DateTime));
     return load(query);
 }
 
index ea85a0432f63fd56a8ba1fb2194cd1380226d8f2..0834124fcd1c9728da4b018eb03f74ac89896db3 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -48,7 +48,7 @@ public:
 public:
     static Event getById(int id, int conferenceId);
     static QList<Event> getByDate(const QDate & date, int conferenceId, QString orderBy);
-    static QList<Event> getFavByDate(const QDate & date, int conferenceId); // get Favourities by Date
+    static QList<Event> getFavByDate(const QDate & date, int conferenceId); // get favourites by date
     static QList<Event> getSearchResultByDate(const QDate& date, int conferenceId, QString orderBy);
     static QList<Event> getByTrack(int id);
     static QList<Event> getByDateAndRoom(const QDate& date, int conferenceId);
index ff3d0ebede1201bb1ad6bc6e7a8e3d20e6a0bebf..c92a76da8d11473c25f20426d6128f2a6604ed74 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -21,6 +21,7 @@
 #include "conference.h"
 #include "track.h"
 #include "room.h"
+#include "application.h"
 
 const QString EventModel::COMMA_SEPARATOR = ", ";
 
@@ -34,7 +35,10 @@ void EventModel::Group::setTitle(const QList<Event>& mEvents) {
     for (int i = mFirstEventIndex; i != mFirstEventIndex + mChildCount; ++i) {
         endTime = qMax(mEvents.at(i).start().addSecs(mEvents.at(i).duration()), endTime);
     }
-    mTitle = QString("%1 - %2").arg(startTime.toString("HH:mm")).arg(endTime.toString("HH:mm"));
+    Conference& conference = ((Application*) qApp)->activeConference();
+    QTime s = conference.shiftTime(startTime.time());
+    QTime e = conference.shiftTime(endTime.time());
+    mTitle = QString("%1 - %2").arg(s.toString("HH:mm")).arg(e.toString("HH:mm"));
 }
 
 
index e0be2692e06e19747582ccc7bc8aaf86d847702e..04f2e0090a79d4d871bdf6e57f4b5864de8f7a12 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 966d3150be155219cee2eeec33606ca565f1786f..5ec9e7d3d633237f03a34d01757a19d45eced0ef 100644 (file)
@@ -3,7 +3,7 @@ TEMPLATE = lib
 TARGET = mvc
 DESTDIR = ../bin
 CONFIG += static
-QT += sql
+QT += sql network
 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 QMAKE_CLEAN += ../bin/libmvc.a
 
index 61cff3b167c6dc62b9bdd988c6e029dcba92b678..f4e52186284b2ae270250215f2cb6a2094abc2dc 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 87278bfd8794847bee3bd89b150af5078321d8bd..4804a7518fb08c64cdbd23bbcab6ad327b0ebe0e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 139b1990798034fa7de249e66c429dab04df4212..f828cdd19cf672468af61ea233306613099ec8ca 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 14c302862e40c6ad16b3c24be3f3844e5f48be0b..dd61ccd3f3ce8c029da298210e21d8d490a4e02a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 3535eb39bff709f02ae059dd804771334047e33b..ea3ffa7002936faa9d802a8198a2266e096786fd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 6f4f463be1bbd2ccfc8c9be982389967f57dc22a..da3e6a644305eb62a00c329ca4570ff3c3c1f701 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index fbdfb699e202cfc5b07fed524294a128c84aab47..47888f8e07f04e14468d833d9354025392aa28e7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 6f5e5086c68788a975372c8afdeb93fc48eaa099..8cddd3d7abb3a446311e3c33a72237df6bc0a93f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -66,10 +66,10 @@ void ScheduleXmlParser::parseDataImpl(const QByteArray &aData, const QString& ur
     {
         QDomElement conferenceElement = scheduleElement.firstChildElement("conference");
         QTime conference_day_change;
+        QHash<QString,QString> conference;
         if (!conferenceElement.isNull())
         {
             emit(parsingScheduleBegin());
-            QHash<QString,QString> conference;
             conference["id"] = QString::number(conferenceId); // conference ID is assigned automatically if 0
             conference["title"] = conferenceElement.firstChildElement("title").text();
             conference["subtitle"] = conferenceElement.firstChildElement("subtitle").text();
@@ -81,6 +81,8 @@ void ScheduleXmlParser::parseDataImpl(const QByteArray &aData, const QString& ur
             if (conferenceDayChangeStr.isEmpty()) conferenceDayChangeStr = "04:00:00";
             conference["day_change"] = conferenceDayChangeStr;
             conference["timeslot_duration"] = conferenceElement.firstChildElement("timeslot_duration").text(); // time
+            conference["utc_offset"] = QString();
+            conference["display_time_shift"] = QString();
             conference["url"] = url;
             sqlEngine->addConferenceToDB(conference, conferenceId);
             conferenceId = conference["id"].toInt();
@@ -133,9 +135,16 @@ void ScheduleXmlParser::parseDataImpl(const QByteArray &aData, const QString& ur
                         QDomElement eventDateElement = eventElement.firstChildElement("date");
                         if (!eventDateElement.isNull()) {
                             QString date_str = eventDateElement.text(); // date eg. 2009-02-07T10:00:00+00:00
-                            event_date = QDate::fromString(date_str.left(sqlEngine->DATE_FORMAT.size()), sqlEngine->DATE_FORMAT);
+                            QDateTime event_date_time = QDateTime::fromString(date_str, Qt::ISODate);
+                            if (conference.value("utc_offset").isEmpty()) {
+                                QDateTime utc_event_date_time = event_date_time;
+                                utc_event_date_time.setTimeSpec(Qt::UTC);
+                                int conference_utc_offset = event_date_time.secsTo(utc_event_date_time);
+                                conference["utc_offset"] = QString::number(conference_utc_offset);
+                            }
+                            event_date = event_date_time.date();
                         } else {
-                            event_date = QDate::fromString(dayElement.attribute("date"),sqlEngine->DATE_FORMAT); // date eg. 2009-02-07
+                            event_date = QDate::fromString(dayElement.attribute("date"), Qt::ISODate); // date eg. 2009-02-07
                             if (event_start < conference_day_change) event_date = event_date.addDays(1);
                         }
                         event["date"] = event_date.toString(sqlEngine->DATE_FORMAT); // date eg. 2009-02-07
@@ -180,6 +189,12 @@ void ScheduleXmlParser::parseDataImpl(const QByteArray &aData, const QString& ur
                 }
             } // parsing room elements
         } // parsing day elements
+
+        // Re-write conference as utc_offset was not known previously
+        if (!conference.value("utc_offset").isEmpty()) {
+            sqlEngine->addConferenceToDB(conference, conferenceId);
+        }
+
     } // schedule element
     if (conference_title.isNull()) throw ParseException("Could not parse schedule");
 
index 5ff33682c01383a0ea56b2079889d131d5b4faba..ae15a70ab2e97fde32efeff9fad3be0bd43ab16a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index c156476772f95c56c5ed7ecf11047d4e9e8dcd77..9a5bdb1ca311add9bc3d481da1fc0304357a4577 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -91,8 +91,13 @@ bool SqlEngine::updateDbSchemaVersion000To001() {
 }
 
 
+bool SqlEngine::updateDbSchemaVersion001To002() {
+    return applySqlFile(":/dbschema001to002.sql");
+}
+
+
 bool SqlEngine::createCurrentDbSchema() {
-    return applySqlFile(":/dbschema001.sql");
+    return applySqlFile(":/dbschema002.sql");
 }
 
 
@@ -109,6 +114,9 @@ bool SqlEngine::createOrUpdateDbSchema() {
         // db schema version 0
         return updateDbSchemaVersion000To001();
     case 1:
+        // db schema version 1
+        return updateDbSchemaVersion001To002();
+    case 2:
         // current schema
         return true;
     default:
@@ -141,12 +149,12 @@ void SqlEngine::addConferenceToDB(QHash<QString,QString> &aConference, int confe
     bool insert = conferenceId <= 0;
     if (insert) { // insert conference
         query.prepare("INSERT INTO CONFERENCE (title,url,subtitle,venue,city,start,end,"
-                                                "day_change,timeslot_duration,active) "
+                                                "day_change,timeslot_duration,utc_offset,display_time_shift,active) "
                         " VALUES (:title,:url,:subtitle,:venue,:city,:start,:end,"
-                                                ":day_change,:timeslot_duration,:active)");
+                                                ":day_change,:timeslot_duration,:utc_offset,:display_time_shift,:active)");
     } else { // update conference
         query.prepare("UPDATE CONFERENCE set title=:title, url=:url, subtitle=:subtitle, venue=:venue, city=:city, start=:start, end=:end,"
-                                            "day_change=:day_change, timeslot_duration=:timeslot_duration, active=:active "
+                                            "day_change=:day_change, timeslot_duration=:timeslot_duration, utc_offset=:utc_offset, display_time_shift=:display_time_shift, active=:active "
                       "WHERE id=:id");
     }
     foreach (QString prop_name, (QList<QString>() << "title" << "url" << "subtitle" << "venue" << "city")) {
@@ -157,6 +165,12 @@ void SqlEngine::addConferenceToDB(QHash<QString,QString> &aConference, int confe
     QTime dayChange = QTime::fromString(aConference["day_change"].left(TIME_FORMAT.size()), TIME_FORMAT);
     query.bindValue(":day_change", QTime(0, 0).secsTo(dayChange));
     query.bindValue(":timeslot_duration", -QTime::fromString(aConference["timeslot_duration"],TIME_FORMAT).secsTo(QTime(0,0)));
+    QVariant utc_offset;
+    if (!aConference.value("utc_offset").isEmpty()) utc_offset = aConference["utc_offset"].toInt();
+    query.bindValue(":utc_offset", utc_offset);
+    QVariant display_time_shift;
+    if (!aConference.value("display_time_shift").isEmpty()) display_time_shift = aConference["display_time_shift"].toInt();
+    query.bindValue(":display_time_shift", display_time_shift);
     query.bindValue(":active", 1);
     if (!insert) query.bindValue(":id", conferenceId);
     query.exec();
@@ -326,7 +340,7 @@ void SqlEngine::addLinkToDB(QHash<QString,QString> &aLink) {
 }
 
 
-bool SqlEngine::searchEvent(int aConferenceId, const QHash<QString,QString> &aColumns, const QString &aKeyword) {
+bool SqlEngine::searchEvent(int aConferenceId, const QMultiHash<QString,QString> &aColumns, const QString &aKeyword) {
     if (aColumns.empty()) return false;
 
     // DROP
index 71c7777d762b747d1a9b951d6c6281c1fc0a6bf3..0a964bf599c553517cc1503e43dea9901283bb58 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -50,6 +50,7 @@ class SqlEngine : public QObject {
         int dbSchemaVersion();
         /// called by createOrUpdateDbSchema. Do not use directly. true for success.
         bool updateDbSchemaVersion000To001();
+        bool updateDbSchemaVersion001To002();
         /// called by createOrUpdateDbSchma. Do not use directly. true for success.
         bool createCurrentDbSchema();
         /// creates the current database schema if an empty database is found,
@@ -71,7 +72,7 @@ class SqlEngine : public QObject {
         bool rollbackTransaction();
 
         /// search Events for .... returns true if success
-        bool searchEvent(int conferenceId, const QHash<QString,QString> &columns, const QString &keyword);
+        bool searchEvent(int conferenceId, const QMultiHash<QString,QString> &columns, const QString &keyword);
     private:
         static QString login(const QString &aDatabaseType, const QString &aDatabaseName);
         /// emits a possible error message as signal. Does nothing if there was not last error
index f6bcd6fd7374a083dcdf6e427092a220d36610ae..a115e1202eec2385af5e1d55c48764a32aa0a378 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 412b5bbf1376b85ab7dcd73150d585bdde7f79e7..a6b238a1e4f873f04a4542478ce027e60ca83920 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 0da531ffa37b9084652f583b5e42213f34096c76..881525df67eed74d50e283cf4ce4a8b803b3fa40 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *