From 844e6a69418688d621f6b0e688047672ea940e12 Mon Sep 17 00:00:00 2001 From: mysd Date: Thu, 29 May 2008 20:56:44 +0000 Subject: [PATCH] Adding Calendar Sharing UI: CalDialog Currently not functional - Sample of UI for testing while underlying service is created. Included new calendar image and updated retroshare.pro file. Added to Unfinished items window. -Note: UI resize-to-window is not working properly and will be corrected. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@565 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- retroshare-gui/src/RetroShare.pro | 3 + retroshare-gui/src/gui/ApplicationWindow.cpp | 6 + retroshare-gui/src/gui/CalDialog.cpp | 136 +++++++++ retroshare-gui/src/gui/CalDialog.h | 72 +++++ retroshare-gui/src/gui/CalDialog.ui | 276 +++++++++++++++++++ retroshare-gui/src/gui/images.qrc | 1 + retroshare-gui/src/gui/images/calendar.png | Bin 0 -> 19253 bytes 7 files changed, 494 insertions(+) create mode 100644 retroshare-gui/src/gui/CalDialog.cpp create mode 100644 retroshare-gui/src/gui/CalDialog.h create mode 100644 retroshare-gui/src/gui/CalDialog.ui create mode 100644 retroshare-gui/src/gui/images/calendar.png diff --git a/retroshare-gui/src/RetroShare.pro b/retroshare-gui/src/RetroShare.pro index a82f3e93c..99e61ffbb 100644 --- a/retroshare-gui/src/RetroShare.pro +++ b/retroshare-gui/src/RetroShare.pro @@ -51,6 +51,7 @@ HEADERS += rshare.h \ gui/StartDialog.h \ gui/ChatDialog.h \ gui/BlogDialog.h \ + gui/CalDialog.h \ gui/NetworkDialog.h \ gui/GenCertDialog.h \ gui/TransfersDialog.h \ @@ -152,6 +153,7 @@ HEADERS += rshare.h \ FORMS += gui/ChatDialog.ui \ gui/BlogDialog.ui \ + gui/CalDialog.ui \ gui/StartDialog.ui \ gui/GenCertDialog.ui \ gui/NetworkDialog.ui \ @@ -220,6 +222,7 @@ SOURCES += main.cpp \ gui/GenCertDialog.cpp \ gui/ChatDialog.cpp \ gui/BlogDialog.cpp \ + gui/CalDialog.cpp \ gui/NetworkDialog.cpp \ gui/TransfersDialog.cpp \ gui/graphframe.cpp \ diff --git a/retroshare-gui/src/gui/ApplicationWindow.cpp b/retroshare-gui/src/gui/ApplicationWindow.cpp index c614ba7a7..4228ad1c3 100644 --- a/retroshare-gui/src/gui/ApplicationWindow.cpp +++ b/retroshare-gui/src/gui/ApplicationWindow.cpp @@ -47,6 +47,7 @@ #include "ForumsDialog.h" #include "channels/channelsDialog.h" #include "BlogDialog.h" +#include "CalDialog.h" /* for smplayer */ #include "smplayer.h" @@ -72,6 +73,7 @@ #define IMAGE_RSM16 ":/images/rsmessenger16.png" #define IMAGE_CLOSE ":/images/close_normal.png" #define IMAGE_SMPLAYER ":/images/smplayer_icon32.png" +#define IMAGE_CALENDAR ":/images/calendar.png" /* Keys for UI Preferences */ @@ -118,6 +120,10 @@ ApplicationWindow::ApplicationWindow(QWidget* parent, Qt::WFlags flags) BlogDialog *blogDialog = NULL; ui.stackPages->add(blogDialog = new BlogDialog(ui.stackPages), createPageAction(QIcon(IMAGE_NETWORK), tr("Blog Feed"), grp)); + + CalDialog *calDialog = NULL; + ui.stackPages->add(calDialog = new CalDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_CALENDAR), tr("Shared Calendars"), grp)); diff --git a/retroshare-gui/src/gui/CalDialog.cpp b/retroshare-gui/src/gui/CalDialog.cpp new file mode 100644 index 000000000..38a8d484a --- /dev/null +++ b/retroshare-gui/src/gui/CalDialog.cpp @@ -0,0 +1,136 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2008 Robert Fernie + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#include +#include +#include + +#include +#include + +#include "common/vmessagebox.h" + +//#include "rshare.h" +#include "CalDialog.h" +//#include "rsiface/rspeers.h" +//#include "rsiface/rsrank.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +/** Constructor */ +CalDialog::CalDialog(QWidget *parent) +: MainPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + //declare local variables for GUI items + name = ui.lne_name; + location = ui.lne_location; + status = ui.cbx_status; + calendarList = ui.lst_calList; + + //Set GUI Item Properties + location->setEnabled(false); + + //Create GUI Connections + connect(ui.btn_add,SIGNAL(clicked()),this,SLOT(addItem())); + connect(ui.btn_addFile,SIGNAL(clicked()),this,SLOT(addFile())); + connect(ui.lst_calList,SIGNAL(itemPressed(QListWidgetItem*)),this,SLOT(setDetails(QListWidgetItem*))); + connect(ui.btn_remove,SIGNAL(clicked()),this,SLOT(removeItem())); +} + +void CalDialog::addItem() +{ + itemDetails = new CalItem(); + if(name->text() != QString("")) + itemDetails->name = name->text(); + if(location->text() != QString("")) + itemDetails->location = QString(location->text()); + itemDetails->status = status->currentIndex(); + + //Add Item to Calendar Item Map + calItems.insert(itemDetails->name, *itemDetails); + clearDetails(); //Clear Textbox Details (and itemDetails pointer) + updateList(); //Update listWidget with new map data. +} + +void CalDialog::removeItem() +{ + QListWidgetItem* item = calendarList->currentItem(); + calItems.remove(item->text()); + clearDetails(); + updateList(); +} + +void CalDialog::updateList() +{ + calendarList->clear(); //Clear existing items + //Rebuild list from Map + QMap::iterator it; + for(it = calItems.begin();it != calItems.end();++it) + calendarList->addItem(it.key()); +} + +void CalDialog::clearDetails() +{ + name->setText(""); + location->setText(""); + status->setCurrentIndex(0); + itemDetails = NULL; +} + +void CalDialog::addFile() +{ + //Prompt for ICS calendar file + QStringList file = QFileDialog::getOpenFileNames(this, + "Select calendar to share",location->text(), "Calendars (*.ics)"); + + //Populate location LineEdit if file selected + if(!file.empty()) + location->setText(*file.begin()); +} + +void CalDialog::setDetails(QListWidgetItem* item) +{ + clearDetails(); + QMap::iterator it = calItems.find(item->text()); + CalItem temp = it.value(); + name->setText(temp.name); + location->setText(temp.location); + status->setCurrentIndex(temp.status); +} diff --git a/retroshare-gui/src/gui/CalDialog.h b/retroshare-gui/src/gui/CalDialog.h new file mode 100644 index 000000000..8a958852a --- /dev/null +++ b/retroshare-gui/src/gui/CalDialog.h @@ -0,0 +1,72 @@ +/**************************************************************** + * RetroShare GUI is distributed under the following license: + * + * Copyright (C) 2008 Robert Fernie + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#ifndef _CALENDAR_DIALOG_H +#define _CALENDAR_DIALOG_H + +#include +#include +#include +#include + +#include "mainpage.h" +#include "ui_CalDialog.h" + +class CalItem +{ + public: + CalItem() {return;} + QString name; + QString location; + int status; +}; + +class CalDialog : public MainPage +{ + Q_OBJECT + +public: +/** Default Constructor */ + CalDialog(QWidget *parent = 0); + +private slots: + void addItem(); + void removeItem(); + void updateList(); + void clearDetails(); + void addFile(); + void setDetails(QListWidgetItem*); + +private: + //Should this be a vector for alphabetical sorting? + QMap calItems; + CalItem *itemDetails; + +/** Qt Designer generated object */ + Ui::CalDialog ui; + + QLineEdit* name; + QLineEdit* location; + QComboBox* status; + QListWidget* calendarList; +}; + +#endif diff --git a/retroshare-gui/src/gui/CalDialog.ui b/retroshare-gui/src/gui/CalDialog.ui new file mode 100644 index 000000000..93dbe8d36 --- /dev/null +++ b/retroshare-gui/src/gui/CalDialog.ui @@ -0,0 +1,276 @@ + + CalDialog + + + + 0 + 0 + 790 + 492 + + + + Form + + + + + 10 + 10 + 771 + 469 + + + + + 0 + 0 + + + + QTabWidget::Rounded + + + 0 + + + Qt::ElideNone + + + + Local Calendars + + + + + 9 + 9 + 201 + 421 + + + + + QLayout::SetMaximumSize + + + + + + 75 + true + + + + Shared Calendar List + + + + + + + + + + + + 220 + 70 + 540 + 301 + + + + + QLayout::SetMaximumSize + + + + + Name: + + + + + + + + + + Location: + + + + + + + QLayout::SetMaximumSize + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + 30 + 0 + + + + + 0 + 16777215 + + + + + 0 + 0 + + + + ... + + + + + + + + + Status: + + + + + + + + 100 + 0 + + + + + 0 + 16777215 + + + + + Private + + + + + Public + + + + + + + + Allow List: + + + + + + + + <Disabled> + + + + + + + + + + 220 + 372 + 540 + 33 + + + + + QLayout::SetMaximumSize + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Add + + + + + + + Remove + + + + + + + + + 220 + 51 + 121 + 21 + + + + + 75 + true + + + + Share Details + + + + + + Peer Calendars + + + + + + + + + diff --git a/retroshare-gui/src/gui/images.qrc b/retroshare-gui/src/gui/images.qrc index b5424e4ae..973176348 100644 --- a/retroshare-gui/src/gui/images.qrc +++ b/retroshare-gui/src/gui/images.qrc @@ -31,6 +31,7 @@ images/attachment.png images/avatar_background.png images/backgroundimage.png + images/calendar.png images/chat.png images/chat/bar_end.png images/chat/bar_fill.png diff --git a/retroshare-gui/src/gui/images/calendar.png b/retroshare-gui/src/gui/images/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..e91b13d736cd0274f912f00d01bd82e2f0133e1e GIT binary patch literal 19253 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