-rw-r--r-- | core/launcher/launcher.cpp | 3 | ||||
-rw-r--r-- | core/pim/today/changelog | 1 | ||||
-rw-r--r-- | core/pim/today/today.cpp | 2 |
3 files changed, 3 insertions, 3 deletions
diff --git a/core/launcher/launcher.cpp b/core/launcher/launcher.cpp index a0f04f1..59b38e3 100644 --- a/core/launcher/launcher.cpp +++ b/core/launcher/launcher.cpp @@ -686,309 +686,308 @@ void Launcher::externalSelected(const AppLnk *appLnk) emit executing( appLnk ); } void Launcher::properties( AppLnk *appLnk ) { if ( appLnk->type() == "Folder" ) { // Not supported: flat is simpler for the user } else { in_lnk_props = TRUE; got_lnk_change = FALSE; LnkProperties prop(appLnk); connect(&prop, SIGNAL(select(const AppLnk *)), this, SLOT(externalSelected(const AppLnk *))); prop.showMaximized(); prop.exec(); in_lnk_props = FALSE; if ( got_lnk_change ) { updateLink(lnk_change); } } } void Launcher::updateLink(const QString& link) { if (link.isNull()) updateTabs(); else if (link.isEmpty()) updateDocs(); else tabs->updateLink(link); } void Launcher::systemMessage( const QCString &msg, const QByteArray &data) { QDataStream stream( data, IO_ReadOnly ); if ( msg == "closing(QString)" ){ QString app; stream >> app; qWarning("app closed %s", app.latin1() ); MRUList::removeTask( app ); }else if ( msg == "linkChanged(QString)" ) { QString link; stream >> link; if ( in_lnk_props ) { got_lnk_change = TRUE; lnk_change = link; } else { updateLink(link); } } else if ( msg == "busy()" ) { emit busy(); } else if ( msg == "notBusy(QString)" ) { QString app; stream >> app; tabs->setBusy(FALSE); emit notBusy(app); } else if ( msg == "mkdir(QString)" ) { QString dir; stream >> dir; if ( !dir.isEmpty() ) mkdir( dir ); } else if ( msg == "rdiffGenSig(QString,QString)" ) { QString baseFile, sigFile; stream >> baseFile >> sigFile; QRsync::generateSignature( baseFile, sigFile ); } else if ( msg == "rdiffGenDiff(QString,QString,QString)" ) { QString baseFile, sigFile, deltaFile; stream >> baseFile >> sigFile >> deltaFile; QRsync::generateDiff( baseFile, sigFile, deltaFile ); } else if ( msg == "rdiffApplyPatch(QString,QString)" ) { QString baseFile, deltaFile; stream >> baseFile >> deltaFile; if ( !QFile::exists( baseFile ) ) { QFile f( baseFile ); f.open( IO_WriteOnly ); f.close(); } QRsync::applyDiff( baseFile, deltaFile ); QCopEnvelope e( "QPE/Desktop", "patchApplied(QString)" ); e << baseFile; } else if ( msg == "rdiffCleanup()" ) { mkdir( "/tmp/rdiff" ); QDir dir; dir.setPath( "/tmp/rdiff" ); QStringList entries = dir.entryList(); for ( QStringList::Iterator it = entries.begin(); it != entries.end(); ++it ) dir.remove( *it ); } else if ( msg == "sendHandshakeInfo()" ) { QString home = getenv( "HOME" ); QCopEnvelope e( "QPE/Desktop", "handshakeInfo(QString,bool)" ); e << home; int locked = (int) Desktop::screenLocked(); e << locked; // register an app for autostart // if clear is send the list is cleared. } else if ( msg == "autoStart(QString)" ) { QString appName; stream >> appName; Config cfg( "autostart" ); cfg.setGroup( "AutoStart" ); if ( appName.compare("clear") == 0){ cfg.writeEntry("Apps", ""); } } else if ( msg == "autoStart(QString,QString)" ) { QString modifier, appName; stream >> modifier >> appName; Config cfg( "autostart" ); cfg.setGroup( "AutoStart" ); if ( modifier.compare("add") == 0 ){ // only add if appname is entered if (!appName.isEmpty()) { cfg.writeEntry("Apps", appName); } } else if (modifier.compare("remove") == 0 ) { // need to change for multiple entries // actually remove is right now simular to clear, but in future there // should be multiple apps in autostart possible. QString checkName; checkName = cfg.readEntry("Apps", ""); if (checkName == appName) { cfg.writeEntry("Apps", ""); } } // case the autostart feature should be delayed } else if ( msg == "autoStart(QString, QString, QString)") { QString modifier, appName, delay; stream >> modifier >> appName >> delay; Config cfg( "autostart" ); cfg.setGroup( "AutoStart" ); if ( modifier.compare("add") == 0 ){ // only add it appname is entered if (!appName.isEmpty()) { cfg.writeEntry("Apps", appName); cfg.writeEntry("Delay", delay); } } else { } } else if ( msg == "sendCardInfo()" ) { QCopEnvelope e( "QPE/Desktop", "cardInfo(QString)" ); const QList<FileSystem> &fs = storage->fileSystems(); QListIterator<FileSystem> it ( fs ); QString s; QString homeDir = getenv("HOME"); QString hardDiskHome; for ( ; it.current(); ++it ) { if ( (*it)->isRemovable() ) s += (*it)->name() + "=" + (*it)->path() + "/Documents " + QString::number( (*it)->availBlocks() * (*it)->blockSize() ) + " " + (*it)->options() + ";"; else if ( (*it)->disk() == "/dev/mtdblock1" || (*it)->disk() == "/dev/mtdblock/1" ) s += (*it)->name() + "=" + homeDir + "/Documents " + QString::number( (*it)->availBlocks() * (*it)->blockSize() ) + " " + (*it)->options() + ";"; else if ( (*it)->name().contains( "Hard Disk") && homeDir.contains( (*it)->path() ) && (*it)->path().length() > hardDiskHome.length() ) hardDiskHome = (*it)->name() + "=" + homeDir + "/Documents " + QString::number( (*it)->availBlocks() * (*it)->blockSize() ) + " " + (*it)->options() + ";"; } if ( !hardDiskHome.isEmpty() ) s += hardDiskHome; e << s; } else if ( msg == "sendSyncDate(QString)" ) { QString app; stream >> app; Config cfg( "qpe" ); cfg.setGroup("SyncDate"); QCopEnvelope e( "QPE/Desktop", "syncDate(QString,QString)" ); e << app << cfg.readEntry( app ); //qDebug("QPE/System sendSyncDate for %s: response %s", app.latin1(), //cfg.readEntry( app ).latin1() ); } else if ( msg == "setSyncDate(QString,QString)" ) { QString app, date; stream >> app >> date; Config cfg( "qpe" ); cfg.setGroup("SyncDate"); cfg.writeEntry( app, date ); //qDebug("setSyncDate(QString,QString) %s %s", app.latin1(), date.latin1()); } else if ( msg == "startSync(QString)" ) { QString what; stream >> what; delete syncDialog; syncDialog = 0; syncDialog = new SyncDialog( this, "syncProgress", FALSE, WStyle_Tool | WStyle_Customize | Qt::WStyle_StaysOnTop ); syncDialog->showMaximized(); syncDialog->whatLabel->setText( "<b>" + what + "</b>" ); connect( syncDialog->buttonCancel, SIGNAL( clicked() ), SLOT( cancelSync() ) ); - } - else if ( msg == "stopSync()") { + } else if ( msg == "stopSync()") { delete syncDialog; syncDialog = 0; } else if ( msg == "getAllDocLinks()" ) { loadDocs(); QString contents; for ( QListIterator<DocLnk> it( docsFolder->children() ); it.current(); ++it ) { DocLnk *doc = it.current(); QFileInfo fi( doc->file() ); if ( !fi.exists() ) continue; bool fake = !doc->linkFileKnown(); if ( !fake ) { QFile f( doc->linkFile() ); if ( f.open( IO_ReadOnly ) ) { QTextStream ts( &f ); ts.setEncoding( QTextStream::UnicodeUTF8 ); contents += ts.read(); f.close(); } else fake = TRUE; } if (fake) { contents += "[Desktop Entry]\n"; contents += "Categories = " + Qtopia::Record::idsToString( doc->categories() ) + "\n"; contents += "File = "+doc->file()+"\n"; contents += "Name = "+doc->name()+"\n"; contents += "Type = "+doc->type()+"\n"; } contents += QString("Size = %1\n").arg( fi.size() ); } //qDebug( "sending length %d", contents.length() ); QCopEnvelope e( "QPE/Desktop", "docLinks(QString)" ); e << contents; qDebug( "================ \n\n%s\n\n===============", contents.latin1() ); delete docsFolder; docsFolder = 0; } } void Launcher::cancelSync() { QCopEnvelope e( "QPE/Desktop", "cancelSync()" ); } void Launcher::storageChanged() { if ( in_lnk_props ) { got_lnk_change = TRUE; lnk_change = ""; } else { updateDocs(); } } bool Launcher::mkdir(const QString &localPath) { QDir fullDir(localPath); if (fullDir.exists()) return true; // at this point the directory doesn't exist // go through the directory tree and start creating the direcotories // that don't exist; if we can't create the directories, return false QString dirSeps = "/"; int dirIndex = localPath.find(dirSeps); QString checkedPath; // didn't find any seps; weird, use the cur dir instead if (dirIndex == -1) { //qDebug("No seperators found in path %s", localPath.latin1()); checkedPath = QDir::currentDirPath(); } while (checkedPath != localPath) { // no more seperators found, use the local path if (dirIndex == -1) checkedPath = localPath; else { // the next directory to check checkedPath = localPath.left(dirIndex) + "/"; // advance the iterator; the next dir seperator dirIndex = localPath.find(dirSeps, dirIndex+1); } QDir checkDir(checkedPath); if (!checkDir.exists()) { //qDebug("mkdir making dir %s", checkedPath.latin1()); if (!checkDir.mkdir(checkedPath)) { qDebug("Unable to make directory %s", checkedPath.latin1()); return FALSE; } } } return TRUE; } void Launcher::preloadApps() { Config cfg("Launcher"); cfg.setGroup("Preload"); QStringList apps = cfg.readListEntry("Apps",','); for (QStringList::ConstIterator it=apps.begin(); it!=apps.end(); ++it) { QCopEnvelope e("QPE/Application/"+(*it).local8Bit(), "enablePreload()"); } } diff --git a/core/pim/today/changelog b/core/pim/today/changelog index 93bbcac..73de50d 100644 --- a/core/pim/today/changelog +++ b/core/pim/today/changelog @@ -1,96 +1,97 @@ 0.3.4 +* "fill our business card now a clickable label" * Several bugfixes regarding todo section. 0.3.3 * Changed the logo so it better scales to bigger display and also made the "Today" string translatable. * some am/pm fixes * clickable labels now in libopie 0.3.2 * Autostart is now more configurable. You can decide how long the ipaq has to has been suspended, before autostart is triggered.(Opie only) * am/pm time optinal (autodetect) 0.3.1 * fixed the wrong color of the buttons * better translation (thanks carsten and others) * fixes memory leaks * bugfixes in calendar part, now location and note are working again. 0.3.0 * today uses now tododb from libopie. So major changes in the todo part: - overdue items on top - then sorted by date, then by priority * some cleanups * speed optimisations 0.2.9 * Many bugfixes. * Today now apparently sorts the dates _allways_ right, i would assume it to be a qt bug 0.2.8 * Appointments are now clickable (connection to datebook still missing) * autostart support (opie only) 0.2.7 * check if todolist.xml was changed before parsing it * check only every 30 sec for changes. * some visual stuff * as usual many little improvements .-) 0.2.6 * added scrollbars to dates and todo * all day detection * some smaller bugfixes 0.2.5 * some other minor fixes regarding autoupdate * fixed segfault with todolist > 7 entries * fixed the "ugly grey border around buttons" issue * fixed the "empty calendar field" "bug" * shown only later appointments as option 0.2.4 * added support for email * autoupdates after 1 min * QCopEnvelope instead of system() * starting to use qvbox in gui 0.2.3 * the 4 am release * several bugfixes 0.2.2 * started working on calling other apps * and finished it 0.2.1 * images no more inline * config dialog 0.1.1 * started changelog. * fixed segfault on empty/nonexistant todolist.xml * better handling for file location diff --git a/core/pim/today/today.cpp b/core/pim/today/today.cpp index 06cfa01..9e9d31f 100644 --- a/core/pim/today/today.cpp +++ b/core/pim/today/today.cpp @@ -232,392 +232,392 @@ void Today::init() { void Today::startConfig() { conf = new todayconfig ( this, "", true ); // read the config Config cfg("today"); cfg.setGroup("BaseConfig"); //init(); conf->SpinBox1->setValue(MAX_LINES_MEET); // location show box conf->CheckBox1->setChecked(SHOW_LOCATION); // notes show box conf->CheckBox2->setChecked(SHOW_NOTES); // task lines conf->SpinBox2->setValue(MAX_LINES_TASK); // clip when? conf->SpinBox7->setValue(MAX_CHAR_CLIP); // only later conf->CheckBox3->setChecked(ONLY_LATER); // if today should be autostarted conf->CheckBoxAuto->setChecked(AUTOSTART); // autostart only if device has been suspended for X minutes conf->SpinBoxTime->setValue( AUTOSTART_TIMER.toInt() ); conf->exec(); int maxlinestask = conf->SpinBox2->value(); int maxmeet = conf->SpinBox1->value(); int location = conf->CheckBox1->isChecked(); int notes = conf->CheckBox2->isChecked(); int maxcharclip = conf->SpinBox7->value(); int onlylater = conf->CheckBox3->isChecked(); int autostart = conf->CheckBoxAuto->isChecked(); int autostartdelay = conf->SpinBoxTime->value(); cfg.writeEntry("maxlinestask",maxlinestask); cfg.writeEntry("maxcharclip", maxcharclip); cfg.writeEntry("maxlinesmeet",maxmeet); cfg.writeEntry("showlocation",location); cfg.writeEntry("shownotes", notes); cfg.writeEntry("onlylater", onlylater); cfg.setGroup("Autostart"); cfg.writeEntry("autostart", autostart); cfg.writeEntry("autostartdelay", autostartdelay); // sync it to "disk" cfg.write(); NEW_START=1; draw(); AUTOSTART=autostart; autoStart(); } /* * Get all events that are in the datebook xml file for today */ void Today::getDates() { QDate date = QDate::currentDate(); if (AllDateBookEvents) delete AllDateBookEvents; AllDateBookEvents = new QWidget( ); QVBoxLayout* layoutDates = new QVBoxLayout(AllDateBookEvents); if (db) { delete db; } db = new DateBookDB; QValueList<EffectiveEvent> list = db->getEffectiveEvents(date, date); qBubbleSort(list); // printf("Get dates\n"); Config config( "qpe" ); // if 24 h format //bool ampm = config.readBoolEntry( "AMPM", TRUE ); int count=0; if ( list.count() > 0 ) { for ( QValueList<EffectiveEvent>::ConstIterator it=list.begin(); it!=list.end(); ++it ) { if ( count <= MAX_LINES_MEET ) { QTime time = QTime::currentTime(); if (!ONLY_LATER) { count++; DateBookEvent *l=new DateBookEvent(*it, AllDateBookEvents, SHOW_LOCATION, SHOW_NOTES); layoutDates->addWidget(l); connect (l, SIGNAL(editEvent(const Event &)), this, SLOT(editEvent(const Event &))); } else if ((time.toString() <= TimeString::dateString((*it).event().end())) ) { count++; // show only later appointments DateBookEventLater *l=new DateBookEventLater(*it, AllDateBookEvents, SHOW_LOCATION, SHOW_NOTES); layoutDates->addWidget(l); connect (l, SIGNAL(editEvent(const Event &)), this, SLOT(editEvent(const Event &))); } } } if (ONLY_LATER && count==0) { QLabel* noMoreEvents = new QLabel(AllDateBookEvents); noMoreEvents->setText(tr("No more appointments today")); layoutDates->addWidget(noMoreEvents); } } else { QLabel* noEvents = new QLabel(AllDateBookEvents); noEvents->setText(tr("No appointments today")); layoutDates->addWidget(noEvents); } layoutDates->addItem(new QSpacerItem(1,1, QSizePolicy::Minimum, QSizePolicy::Expanding)); sv1->addChild(AllDateBookEvents); AllDateBookEvents->show(); } void Today::getMail() { Config cfg("opiemail"); cfg.setGroup("today"); // how many lines should be showed in the task section int NEW_MAILS = cfg.readNumEntry("newmails",0); int OUTGOING = cfg.readNumEntry("outgoing",0); QString output = tr("<b>%1</b> new mail(s), <b>%2</b> outgoing").arg(NEW_MAILS).arg(OUTGOING); MailField->setText(output); } /* * Get the todos */ void Today::getTodo() { QString output; QString tmpout; int count = 0; int ammount = 0; // get overdue todos first QValueList<ToDoEvent> overDueList = todo->overDue(); qBubbleSort(overDueList); for ( QValueList<ToDoEvent>::Iterator it=overDueList.begin(); it!=overDueList.end(); ++it ) { if (!(*it).isCompleted() && ( ammount < MAX_LINES_TASK) ) { tmpout += "<font color=#e00000><b>-" +((*it).description()).mid(0, MAX_CHAR_CLIP) + "</b></font><br>"; ammount++; } } // get total number of still open todos QValueList<ToDoEvent> openTodo = todo->rawToDos(); qBubbleSort(openTodo); for ( QValueList<ToDoEvent>::Iterator it=openTodo.begin(); it!=openTodo.end(); ++it ) { if (!(*it).isCompleted()){ count +=1; // not the overdues, we allready got them, and not if we are // over the maxlines if (!(*it).isOverdue() && ( ammount < MAX_LINES_TASK) ) { tmpout += "<b>-</b>" + ((*it).description()).mid(0, MAX_CHAR_CLIP) + "<br>"; ammount++; } } } if (count > 0) { if( count == 1 ) { output = tr("There is <b> 1</b> active task: <br>" ); } else { output = tr("There are <b> %1</b> active tasks: <br>").arg(count); } output += tmpout; } else { output = tr("No active tasks"); } TodoField->setText(tr(output)); } - /* * launch addressbook (personal card) */ void Today::editCard() { QCopEnvelope w("QPE/System", "execute(QString)"); w << QString("addressbook"); + // while( !QCopChannel::isRegistered("QPE/Addressbook")) QCopEnvelope v("QPE/Addressbook", "editPersonalAndClose()"); } /* * launches datebook */ void Today::startDatebook() { QCopEnvelope e("QPE/System", "execute(QString)"); e << QString("datebook"); } /* * starts the edit dialog as known from datebook */ extern QPEApplication *todayApp; void Today::editEvent(const Event &e) { startDatebook(); while(!QCopChannel::isRegistered("QPE/Datebook")) todayApp->processEvents(); QCopEnvelope env("QPE/Datebook", "editEvent(int)"); env << e.uid(); } /* * launches todolist */ void Today::startTodo() { QCopEnvelope e("QPE/System", "execute(QString)"); e << QString("todolist"); } /* * launch opiemail */ void Today::startMail() { QCopEnvelope e("QPE/System", "execute(QString)"); e << QString("opiemail"); //Right now start both, maybe decide which to rum via config file .. QCopEnvelope f("QPE/System", "execute(QString)"); f << QString("qtmail"); } Today::~Today() { } /* * Gets the events for the current day, if it should get all dates */ DateBookEvent::DateBookEvent(const EffectiveEvent &ev, QWidget* parent, int SHOW_LOCATION, int SHOW_NOTES, const char* name, WFlags fl) : OClickableLabel(parent,name,fl), event(ev) { QString msg; //QTime time = QTime::currentTime(); Config config( "qpe" ); config.setGroup( "Time" ); // if 24 h format ampm = config.readBoolEntry( "AMPM", TRUE ); if (!ONLY_LATER) { msg += "<B>" + (ev).description() + "</B>"; if ( (ev).event().hasAlarm() ) { msg += " <b>[with alarm]</b>"; } // include location or not if (SHOW_LOCATION == 1) { msg += "<BR><i>" + (ev).location() + "</i>"; } if ( (TimeString::timeString(QTime((ev).event().start().time()) ) == "00:00") && (TimeString::timeString(QTime((ev).event().end().time()) ) == "23:59") ) { msg += "<br>All day"; } else { // start time of event msg += "<br>" + ampmTime(QTime((ev).event().start().time()) ) // end time of event + "<b> - </b>" + ampmTime(QTime((ev).event().end().time()) ); } // include possible note or not if (SHOW_NOTES == 1) { msg += "<br> <i>note</i>:" +((ev).notes()).mid(0, MAX_CHAR_CLIP); } } setText(msg); connect(this, SIGNAL(clicked()), this, SLOT(editMe())); setAlignment( int( QLabel::WordBreak | QLabel::AlignLeft ) ); } QString DateBookEvent::ampmTime(QTime tm) { QString s; if( ampm ) { int hour = tm.hour(); if (hour == 0) hour = 12; if (hour > 12) hour -= 12; s.sprintf( "%2d:%02d %s", hour, tm.minute(), (tm.hour() >= 12) ? "PM" : "AM" ); return s; } else { s.sprintf( "%2d:%02d", tm.hour(), tm.minute() ); return s; } } DateBookEventLater::DateBookEventLater(const EffectiveEvent &ev, QWidget* parent, int SHOW_LOCATION, int SHOW_NOTES, const char* name, WFlags fl) : OClickableLabel(parent,name,fl), event(ev) { QString msg; QTime time = QTime::currentTime(); Config config( "qpe" ); config.setGroup( "Time" ); // if 24 h format ampm = config.readBoolEntry( "AMPM", TRUE ); if ((time.toString() <= TimeString::dateString((ev).event().end())) ) { // show only later appointments msg += "<B>" + (ev).description() + "</B>"; if ( (ev).event().hasAlarm() ) { msg += " <b>[with alarm]</b>"; } // include location or not if (SHOW_LOCATION == 1) { msg += "<BR><i>" + (ev).location() + "</i>"; } if ( (TimeString::timeString(QTime((ev).event().start().time()) ) == "00:00") && (TimeString::timeString(QTime((ev).event().end().time()) ) == "23:59") ) { msg += "<br>All day"; } else { // start time of event msg += "<br>" + ampmTime(QTime((ev).event().start().time()) ) // end time of event + "<b> - </b>" + ampmTime(QTime((ev).event().end().time()) ); } // include possible note or not if (SHOW_NOTES == 1) { msg += "<br> <i>note</i>:" +((ev).notes()).mid(0, MAX_CHAR_CLIP); } } setText(msg); connect(this, SIGNAL(clicked()), this, SLOT(editMe())); setAlignment( int( QLabel::WordBreak | QLabel::AlignLeft ) ); } QString DateBookEventLater::ampmTime(QTime tm) { QString s; if( ampm ) { int hour = tm.hour(); if (hour == 0) hour = 12; if (hour > 12) hour -= 12; s.sprintf( "%2d:%02d %s", hour, tm.minute(), (tm.hour() >= 12) ? "PM" : "AM" ); return s; } else { s.sprintf( "%2d:%02d", tm.hour(), tm.minute() ); return s; } } void DateBookEvent::editMe() { emit editEvent(event.event()); } void DateBookEventLater::editMe() { |