Changeset b431d47


Ignore:
Timestamp:
04/22/10 16:26:31 (12 years ago)
Author:
kirilma <kirilma@…>
Branches:
master, qt5
Children:
7c6cf5e
Parents:
a61c5f5
Message:

reworked UI for conference editing

underlying representation of conference list is also changed

Location:
src
Files:
11 added
9 edited

Legend:

Unmodified
Added
Removed
  • src/gui/gui.pro

    ra61c5f5 rb431d47  
    4040    mainwindow.ui \
    4141    daynavigatorwidget.ui \
    42     importschedulewidget.ui \
    4342    about.ui \
    4443    eventdialog.ui \
     
    4645    tabcontainer.ui \
    4746    mapwindow.ui \
    48     settingsdialog.ui
     47    settingsdialog.ui \
     48    conferenceeditor.ui \
     49    urlinputdialog.ui
    4950
    5051HEADERS += roomstabcontainer.h \
     
    5960    mainwindow.h \
    6061    daynavigatorwidget.h \
    61     importschedulewidget.h \
    6262    eventdialog.h \
    6363    tabcontainer.h \
    6464    mapwindow.h \
    65     settingsdialog.h
     65    settingsdialog.h \
     66    conferenceeditor.h \
     67    urlinputdialog.h
    6668
    6769SOURCES += roomstabcontainer.cpp \
     
    7678    mainwindow.cpp \
    7779    daynavigatorwidget.cpp \
    78     importschedulewidget.cpp \
    7980    eventdialog.cpp \
    8081    tabcontainer.cpp \
    8182    mapwindow.cpp \
    82     settingsdialog.cpp
     83    settingsdialog.cpp \
     84    conferenceeditor.cpp \
     85    urlinputdialog.cpp
    8386
    8487HEADERS += errormessage.h
  • src/gui/mainwindow.cpp

    ra61c5f5 rb431d47  
    2222#include <QFile>
    2323#include <QNetworkProxy>
     24#include <QNetworkAccessManager>
     25#include <QNetworkReply>
    2426
    2527#include <sqlengine.h>
     
    3335#include <QDialog>
    3436#include <QMessageBox>
     37
    3538#include "ui_about.h"
    3639#include <eventdialog.h>
    3740#include "daynavigatorwidget.h"
    38 #include "importschedulewidget.h"
    3941#include "mapwindow.h"
    4042#include "settingsdialog.h"
     43#include "conferenceeditor.h"
     44#include "schedulexmlparser.h"
     45#include "errormessage.h"
    4146
    4247#include <tabcontainer.h>
     
    4853MainWindow::MainWindow(int aEventId, QWidget *aParent)
    4954    : QMainWindow(aParent)
     55    , conferenceModel(new ConferenceModel(this))
     56    , mXmlParser(new ScheduleXmlParser(this))
     57    , mNetworkAccessManager(new QNetworkAccessManager(this))
    5058{
    5159    setupUi(this);
     
    7482    QNetworkProxy::setApplicationProxy(proxy);
    7583
    76     int confId = Conference::activeConference();
    77 
     84    #if 0
     85    // list of conferences must be maintained by ConferenceEditor
     86    // here must be one of the signals from the closing ConferenceEditor (or model):
     87    // selectedConf(conference), noConf()
    7888    connect(importScheduleWidget, SIGNAL(scheduleImported(int)), SLOT(scheduleImported(int)));
    7989    connect(importScheduleWidget, SIGNAL(scheduleDeleted(const QString&)), SLOT(scheduleDeleted(const QString&)));
     90    #endif
    8091
    8192    // event details have changed
     
    8899
    89100    // event conference map button clicked
     101    #if 0
     102    // TODO: think about it when return to maps
    90103    connect(showMapButton, SIGNAL(clicked()), SLOT(conferenceMapClicked()));
     104    #endif
    91105
    92106    connect(aboutAction, SIGNAL(triggered()), SLOT(aboutApp()));
    93107    connect(settingsAction, SIGNAL(triggered()), SLOT(setup()));
    94 
    95     selectConference->setDuplicatesEnabled(false);
     108    connect(conferencesAction, SIGNAL(triggered()), SLOT(showConferences()));
     109
     110    useConference(Conference::activeConference());
     111
     112    #if 0
     113    // TODO: remove GUI
     114    // initialisation of model and pick active conference from there and call conferenceChanged()
     115    // selectConference->setDuplicatesEnabled(false);
    96116    int confCount = Conference::getAll().count();
    97117    if(confCount)
    98118    {
    99119        initTabs();
    100         fillAndShowConferenceHeader();
     120        // fillAndShowConferenceHeader();
    101121        setWindowTitle(Conference::getById(confId).title());
    102122
     
    106126        {
    107127            Conference conf = i.next();
    108             selectConference->addItem(conf.title(),conf.id());
     128            // TODO: remove GUI
     129            // selectConference->addItem(conf.title(),conf.id());
    109130        }
    110         int idx = selectConference->findText(Conference::getById(Conference::activeConference()).title());
    111         selectConference->setCurrentIndex(idx);
    112         connect(selectConference, SIGNAL(currentIndexChanged(int)), SLOT(conferenceChanged(int)));
    113         conferenceChanged(idx);
     131        // TODO: remove GUI
     132        // int idx = selectConference->findText(Conference::getById(Conference::activeConference()).title());
     133        // selectConference->setCurrentIndex(idx);
     134        // connect(selectConference, SIGNAL(currentIndexChanged(int)), SLOT(conferenceChanged(int)));
     135        // conferenceChanged(idx);
    114136    }
    115137    else
    116138    {
    117         conferenceHeader->hide();
    118         selectConferenceWidget->hide();
    119         // go to the 'conferenceTab', so the user can import the schedule
    120         tabWidget->setCurrentIndex(6); // 6 - conference tab
    121     }
     139        // TODO: remove GUI
     140        // conferenceHeader->hide();
     141        // selectConferenceWidget->hide();
     142        // // go to the 'conferenceTab', so the user can import the schedule
     143        // tabWidget->setCurrentIndex(6); // 6 - conference tab
     144    }
     145    #endif
    122146
    123147    // open dialog for given Event ID
     
    133157        catch(...) {} // just start application
    134158    }
     159
     160    connect(mNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), SLOT(networkQueryFinished(QNetworkReply*)));
     161
     162    connect(mXmlParser, SIGNAL(parsingScheduleBegin()), conferenceModel, SLOT(newConferenceBegin()));
     163    connect(mXmlParser, SIGNAL(parsingScheduleEnd(const QString&)), conferenceModel, SLOT(newConferenceEnd(const QString&)));
    135164}
    136165
     
    138167{
    139168    Q_UNUSED(aConfId);
     169
     170    // TODO: this all goes to ConferenceEditor and model of conferences
     171    #if 0
    140172
    141173    Conference conf = Conference::getById(aConfId);
     
    156188        conferenceChanged(idx);
    157189    }
     190    #endif
    158191}
    159192
    160193void MainWindow::scheduleDeleted(const QString& title)
    161194{
     195    Q_UNUSED(title);
     196    // TODO: this all goes to ConferenceEditor and model of conferences
     197    #if 0
    162198    int idx = selectConference->findText(title);
    163199
     
    177213        selectConference->removeItem(idx);
    178214    }
     215    #endif
    179216}
    180217
     
    213250}
    214251
    215 void MainWindow::fillAndShowConferenceHeader()
     252void MainWindow::useConference(int id)
     253{
     254    try {
     255        Conference::getById(Conference::activeConference()).update("active",0);
     256        Conference::getById(id).update("active",1);
     257
     258        initTabs();
     259    } catch (OrmException& e) {
     260        // cannon set an active conference
     261        unsetConference();
     262        return;
     263    }
     264
     265}
     266
     267void MainWindow::initTabs()
    216268{
    217269    int confId = Conference::activeConference();
    218     conferenceTitle->setText(Conference::getById(confId).title());
    219     conferenceSubtitle->setText(Conference::getById(confId).subtitle());
    220     conferenceWhere->setText(Conference::getById(confId).city() + ", " + Conference::getById(confId).venue());
    221     conferenceWhen->setText(
    222             Conference::getById(confId).start().toString("dd-MM-yyyy")
    223             + ", " +
    224             Conference::getById(confId).end().toString("dd-MM-yyyy"));
    225     conferenceHeader->show();
    226 }
    227 
    228 void MainWindow::initTabs()
    229 {
    230     int confId = Conference::activeConference();
    231     QDate startDate = Conference::getById(confId).start();
    232     QDate endDate = Conference::getById(confId).end();
     270    Conference active = Conference::getById(confId);
     271    QDate startDate = active.start();
     272    QDate endDate = active.end();
     273    setWindowTitle(active.title());
    233274
    234275    // 'dayNavigator' emits signal 'dateChanged' after setting valid START:END dates
     
    252293    nowTabContainer->clearModel();
    253294
    254     conferenceHeader->hide();
     295    // TODO:  remove
     296    // conferenceHeader->hide();
    255297    setWindowTitle(saved_title);
    256 }
    257 
    258 void MainWindow::conferenceChanged(int aIndex)
    259 {
    260     if (aIndex < 0) {
    261         // no conferences left? reset all views
    262         unsetConference();
    263         return;
    264     }
    265 
    266     try {
    267         Conference::getById(Conference::activeConference()).update("active",0);
    268         Conference::getById(selectConference->itemData(aIndex).toInt()).update("active",1);
    269     } catch (OrmException& e) {
    270         // cannon set an active conference
    271         unsetConference();
    272         return;
    273     }
    274 
    275     initTabs();
    276     fillAndShowConferenceHeader();
    277     setWindowTitle(Conference::getById(Conference::activeConference()).title());
    278298}
    279299
     
    292312    QNetworkProxy::setApplicationProxy(proxy);
    293313}
     314
     315/** Create and run ConferenceEditor dialog, making required connections for it.
     316
     317This method manages, which classes actually perform changes in conference list.
     318
     319There are several classes that modify the conferences:
     320this:
     321 deletion and URL update.
     322this, mXmlParser and mNetworkAccessManager:
     323 addition and refresh.
     324*/
     325void MainWindow::showConferences()
     326{
     327    ConferenceEditor dialog(conferenceModel, this);
     328
     329    // TODO: connect signals about progress of network and parsing
     330
     331    connect(&dialog, SIGNAL(haveConferenceUrl(const QString&)), SLOT(importFromNetwork(const QString&)));
     332    connect(&dialog, SIGNAL(haveConferenceFile(const QString&)), SLOT(importFromFile(const QString&)));
     333    connect(&dialog, SIGNAL(removeConferenceRequested(int)), SLOT(removeConference(int)));
     334    connect(&dialog, SIGNAL(changeUrlRequested(int, const QString&)),
     335                    SLOT(changeConferenceUrl(int, const QString&)));
     336
     337    connect(&dialog, SIGNAL(haveConferenceSelected(int)), SLOT(useConference(int)));
     338    connect(&dialog, SIGNAL(noneConferenceSelected()), SLOT(unsetConference()));
     339
     340    connect(mXmlParser, SIGNAL(parsingScheduleBegin()), &dialog, SLOT(importStarted()));
     341    connect(mXmlParser, SIGNAL(progressStatus(int)), &dialog, SLOT(showParsingProgress(int)));
     342    connect(mXmlParser, SIGNAL(parsingScheduleEnd(const QString&)), &dialog, SLOT(importFinished(const QString&)));
     343
     344    connect(this, SIGNAL(conferenceRemoved()), &dialog, SLOT(conferenceRemoved()));
     345
     346    dialog.exec();
     347}
     348
     349void MainWindow::networkQueryFinished(QNetworkReply *aReply)
     350{
     351    if ( aReply->error() != QNetworkReply::NoError )
     352    {
     353        error_message(QString("Error occured during download: ") + aReply->errorString());
     354    }
     355    else
     356    {
     357        qDebug() << __PRETTY_FUNCTION__ << ": have data";
     358        importData(aReply->readAll(), aReply->url().toEncoded());
     359    }
     360}
     361
     362void MainWindow::importData(const QByteArray &aData, const QString& url)
     363{
     364    // TODO: remove GUI
     365    // instead send signals to the child dialog
     366    #if 0
     367    browse->hide();
     368    online->hide();
     369    progressBar->show();
     370    // proxySettings->hide();
     371    #endif
     372
     373    int confId = mXmlParser->parseData(aData, url);
     374
     375    #if 0
     376    progressBar->hide();
     377    browse->show();
     378    online->show();
     379    // proxySettings->show();
     380    importScheduleLabel->setText("Schedule:");
     381
     382    #endif
     383    if (confId > 0) {
     384        emit(scheduleImported(confId));
     385    }
     386}
     387
     388void MainWindow::importFromNetwork(const QString& url)
     389{
     390    qDebug() << __PRETTY_FUNCTION__;
     391    QNetworkRequest request;
     392    request.setUrl(QUrl(url));
     393
     394    mNetworkAccessManager->setProxy(QNetworkProxy::applicationProxy());
     395    mNetworkAccessManager->get(request);
     396}
     397
     398void MainWindow::importFromFile(const QString& filename)
     399{
     400    qDebug() << __PRETTY_FUNCTION__;
     401    QFile file(filename);
     402    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {   
     403        static const QString format("Cannot read \"%1\": error %2");
     404        error_message(format.arg(filename, QString::number(file.error())));
     405    }
     406
     407    importData(file.readAll(), "");
     408}
     409
     410void MainWindow::removeConference(int id)
     411{
     412    Conference::deleteConference(id);
     413    conferenceModel->conferenceRemoved();
     414
     415    emit conferenceRemoved();
     416}
     417
     418void MainWindow::changeConferenceUrl(int id, const QString& url)
     419{
     420    Conference::getById(id).setUrl(url);
     421}
     422
  • src/gui/mainwindow.h

    ra61c5f5 rb431d47  
    2424#include <ui_mainwindow.h>
    2525
     26#include "conferencemodel.h"
     27
     28class ScheduleXmlParser;
     29class QNetworkAccessManager;
     30class QNetworkReply;
     31
    2632class MainWindow : public QMainWindow, private Ui::MainWindow
    2733{
     
    3238    MainWindow(int aEventId = 0, QWidget *aParent = NULL);
    3339    ~MainWindow() {}
     40signals:
     41    void conferenceRemoved();
    3442private slots:
    3543    void scheduleImported(int aConfId);
     
    3846    void conferenceMapClicked();
    3947    void eventHasChanged(int aEventId, bool aReloadModel);
    40     void conferenceChanged(int aIndex);
    4148    void setup();
     49    // TODO: remove
     50    void showConferences();
     51    void networkQueryFinished(QNetworkReply*);
     52    void importFromNetwork(const QString&);
     53    void importFromFile(const QString&);
     54    void removeConference(int);
     55    void changeConferenceUrl(int, const QString&);
     56
     57    void useConference(int id);
     58    void unsetConference();
    4259private:
    4360    void fillAndShowConferenceHeader();
    4461    void initTabs();
    45     void unsetConference();
     62    void importData(const QByteArray &aData, const QString& url);
    4663
    4764    QString saved_title;
     65    ConferenceModel* conferenceModel;
     66    ScheduleXmlParser *mXmlParser;
     67    QNetworkAccessManager *mNetworkAccessManager;
    4868};
    4969
  • src/gui/mainwindow.ui

    ra61c5f5 rb431d47  
    9494       </layout>
    9595      </widget>
    96       <widget class="QWidget" name="conferenceTab">
    97        <attribute name="title">
    98         <string>Conference</string>
    99        </attribute>
    100        <layout class="QGridLayout" name="gridLayout_5">
    101         <item row="0" column="0">
    102          <layout class="QVBoxLayout" name="verticalLayout_4">
    103           <item>
    104            <widget class="QWidget" name="conferenceHeader" native="true">
    105             <layout class="QGridLayout" name="gridLayout_9">
    106              <item row="0" column="0">
    107               <widget class="QLabel" name="conferenceTitle">
    108                <property name="font">
    109                 <font>
    110                  <weight>75</weight>
    111                  <bold>true</bold>
    112                 </font>
    113                </property>
    114                <property name="text">
    115                 <string>Conference Name</string>
    116                </property>
    117                <property name="alignment">
    118                 <set>Qt::AlignCenter</set>
    119                </property>
    120                <property name="wordWrap">
    121                 <bool>true</bool>
    122                </property>
    123               </widget>
    124              </item>
    125              <item row="1" column="0">
    126               <widget class="QLabel" name="conferenceSubtitle">
    127                <property name="text">
    128                 <string>Conference Subtitle</string>
    129                </property>
    130                <property name="alignment">
    131                 <set>Qt::AlignCenter</set>
    132                </property>
    133                <property name="wordWrap">
    134                 <bool>true</bool>
    135                </property>
    136               </widget>
    137              </item>
    138              <item row="2" column="0">
    139               <widget class="Line" name="line">
    140                <property name="orientation">
    141                 <enum>Qt::Horizontal</enum>
    142                </property>
    143               </widget>
    144              </item>
    145              <item row="3" column="0">
    146               <layout class="QGridLayout" name="gridLayout_6">
    147                <item row="0" column="0">
    148                 <widget class="QLabel" name="label">
    149                  <property name="font">
    150                   <font>
    151                    <weight>75</weight>
    152                    <italic>true</italic>
    153                    <bold>true</bold>
    154                   </font>
    155                  </property>
    156                  <property name="text">
    157                   <string>When:</string>
    158                  </property>
    159                 </widget>
    160                </item>
    161                <item row="1" column="0">
    162                 <widget class="QLabel" name="label_2">
    163                  <property name="font">
    164                   <font>
    165                    <weight>75</weight>
    166                    <italic>true</italic>
    167                    <bold>true</bold>
    168                   </font>
    169                  </property>
    170                  <property name="text">
    171                   <string>Where:</string>
    172                  </property>
    173                 </widget>
    174                </item>
    175                <item row="0" column="2">
    176                 <widget class="QLabel" name="conferenceWhen">
    177                  <property name="text">
    178                   <string>DATE (FROM - TO)</string>
    179                  </property>
    180                 </widget>
    181                </item>
    182                <item row="1" column="2">
    183                 <widget class="QLabel" name="conferenceWhere">
    184                  <property name="text">
    185                   <string>CITY, CAMPUS</string>
    186                  </property>
    187                 </widget>
    188                </item>
    189                <item row="1" column="3">
    190                 <widget class="QPushButton" name="showMapButton">
    191                  <property name="text">
    192                   <string>MAP</string>
    193                  </property>
    194                  <property name="icon">
    195                   <iconset resource="../icons.qrc">
    196                    <normaloff>:/icons/compassBig.png</normaloff>:/icons/compassBig.png</iconset>
    197                  </property>
    198                  <property name="flat">
    199                   <bool>true</bool>
    200                  </property>
    201                 </widget>
    202                </item>
    203                <item row="1" column="4">
    204                 <spacer name="horizontalSpacer_3">
    205                  <property name="orientation">
    206                   <enum>Qt::Horizontal</enum>
    207                  </property>
    208                  <property name="sizeHint" stdset="0">
    209                   <size>
    210                    <width>40</width>
    211                    <height>20</height>
    212                   </size>
    213                  </property>
    214                 </spacer>
    215                </item>
    216                <item row="0" column="1">
    217                 <widget class="QLabel" name="spacer">
    218                  <property name="text">
    219                   <string/>
    220                  </property>
    221                 </widget>
    222                </item>
    223               </layout>
    224              </item>
    225              <item row="4" column="0">
    226               <widget class="Line" name="line_2">
    227                <property name="orientation">
    228                 <enum>Qt::Horizontal</enum>
    229                </property>
    230               </widget>
    231              </item>
    232             </layout>
    233            </widget>
    234           </item>
    235           <item>
    236            <widget class="QWidget" name="selectConferenceWidget" native="true">
    237             <property name="sizePolicy">
    238              <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
    239               <horstretch>0</horstretch>
    240               <verstretch>0</verstretch>
    241              </sizepolicy>
    242             </property>
    243             <layout class="QHBoxLayout" name="horizontalLayout">
    244              <item>
    245               <widget class="QLabel" name="selectConferenceLabel">
    246                <property name="text">
    247                 <string>Select conference: </string>
    248                </property>
    249               </widget>
    250              </item>
    251              <item>
    252               <spacer name="horizontalSpacer">
    253                <property name="orientation">
    254                 <enum>Qt::Horizontal</enum>
    255                </property>
    256                <property name="sizeHint" stdset="0">
    257                 <size>
    258                  <width>40</width>
    259                  <height>20</height>
    260                 </size>
    261                </property>
    262               </spacer>
    263              </item>
    264              <item>
    265               <widget class="QComboBox" name="selectConference">
    266                <property name="sizePolicy">
    267                 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
    268                  <horstretch>0</horstretch>
    269                  <verstretch>0</verstretch>
    270                 </sizepolicy>
    271                </property>
    272               </widget>
    273              </item>
    274             </layout>
    275            </widget>
    276           </item>
    277           <item>
    278            <widget class="ImportScheduleWidget" name="importScheduleWidget" native="true">
    279             <property name="sizePolicy">
    280              <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
    281               <horstretch>0</horstretch>
    282               <verstretch>0</verstretch>
    283              </sizepolicy>
    284             </property>
    285            </widget>
    286           </item>
    287           <item>
    288            <spacer name="verticalSpacer">
    289             <property name="orientation">
    290              <enum>Qt::Vertical</enum>
    291             </property>
    292             <property name="sizeHint" stdset="0">
    293              <size>
    294               <width>20</width>
    295               <height>40</height>
    296              </size>
    297             </property>
    298            </spacer>
    299           </item>
    300          </layout>
    301         </item>
    302        </layout>
    303       </widget>
    30496     </widget>
    30597    </item>
     
    322114    <addaction name="settingsAction"/>
    323115    <addaction name="aboutAction"/>
     116    <addaction name="conferencesAction"/>
    324117   </widget>
    325118   <addaction name="menuMenu"/>
     
    348141   </property>
    349142  </action>
     143  <action name="conferencesAction">
     144   <property name="text">
     145    <string>Conferences</string>
     146   </property>
     147  </action>
    350148 </widget>
    351149 <customwidgets>
    352   <customwidget>
    353    <class>ImportScheduleWidget</class>
    354    <extends>QWidget</extends>
    355    <header>importschedulewidget.h</header>
    356    <container>1</container>
    357   </customwidget>
    358150  <customwidget>
    359151   <class>SearchTabContainer</class>
  • src/icons.qrc

    ra61c5f5 rb431d47  
    11<RCC>
    22    <qresource prefix="/">
     3        <file>icons/add.png</file>
     4        <file>icons/remove.png</file>
     5        <file>icons/reload.png</file>
    36        <file>icons/expand.png</file>
    47        <file>icons/collapse.png</file>
  • src/mvc/conference.h

    ra61c5f5 rb431d47  
    5050    int timeslotDuration() const { return value("timeslot_duration").toInt(); } // in seconds
    5151    bool isActive() const { return value("active").toBool(); }
    52     QString getUrl() const
     52    QString url() const
    5353    {
    5454        QVariant val = value("url");
  • src/mvc/mvc.pro

    ra61c5f5 rb431d47  
    2727    eventmodel.h \
    2828    treeview.h \
    29     room.h
     29    room.h \
     30    conferencemodel.h
    3031SOURCES += event.cpp \
    3132    conference.cpp \
     
    3435    eventmodel.cpp \
    3536    treeview.cpp \
    36     room.cpp
     37    room.cpp \
     38    conferencemodel.cpp
  • src/sql/schedulexmlparser.cpp

    ra61c5f5 rb431d47  
    4646
    4747    int confId = 0;
     48    QString conference_title;
    4849    if (!scheduleElement.isNull())
    4950    {
     
    6566            SqlEngine::addConferenceToDB(conference);
    6667            confId = conference["id"].toInt();
    67             emit(parsingSchedule(conference["title"]));
     68            conference_title = conference["title"];
     69            emit(parsingScheduleBegin());
    6870        }
    6971
     
    154156    } // schedule element
    155157    SqlEngine::commitTransaction();
     158    emit parsingScheduleEnd(conference_title);
    156159
    157160    return confId;
  • src/sql/schedulexmlparser.h

    ra61c5f5 rb431d47  
    3333    signals:
    3434        void progressStatus(int aStatus);
    35         void parsingSchedule(const QString &aTitle);
     35        void parsingScheduleBegin();
     36        void parsingScheduleEnd(const QString& title);
    3637};
    3738
Note: See TracChangeset for help on using the changeset viewer.