summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-01-21 15:38:31 (UTC)
committer zautrix <zautrix>2005-01-21 15:38:31 (UTC)
commit4afdcfcac216b428ada79f4750cf7447e3175333 (patch) (side-by-side diff)
tree8f70936ac23137c3f6fb00fce33edbfe3d821f59
parent234b9425bebd41b556277cdd94138fafecc32b45 (diff)
downloadkdepimpi-4afdcfcac216b428ada79f4750cf7447e3175333.zip
kdepimpi-4afdcfcac216b428ada79f4750cf7447e3175333.tar.gz
kdepimpi-4afdcfcac216b428ada79f4750cf7447e3175333.tar.bz2
some fixes
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/SyncHowto.txt2
-rw-r--r--korganizer/kotodoviewitem.cpp6
-rw-r--r--microkde/kdeui/klistview.cpp14
-rw-r--r--version2
4 files changed, 16 insertions, 8 deletions
diff --git a/bin/kdepim/SyncHowto.txt b/bin/kdepim/SyncHowto.txt
index 64f6f14..b0473a1 100644
--- a/bin/kdepim/SyncHowto.txt
+++ b/bin/kdepim/SyncHowto.txt
@@ -1,281 +1,281 @@
WARNING:
YOU MAY GET UNEXPECTED (I.E. WRONG) SYNCHRONIZATION RESULTS,
IF YOU CHANGE AN EVENT ON THE FIRST DEVICE AND SYNC IMMEDIATELY FROM
THE OTHER DEVICE WITH THIS DEVICE, IF THE CLOCKS OF THE TWO DEVICES
HAVE TOO MUCH DIFFERENCE.
In other words: Please make sure, that the clocks of the devices
you want to sync have only a difference of some seconds!
CONTENT:
0) How syncing works
1) Qick overview of settings
2) Sync settings in sync dialog
3) Syncing background
4) Sync preferences
5) How a filter works
6) Details about sync profile kinds
*************************************************************************
0) How syncing works
*************************************************************************
Note:
The recommended and easiest way to syncronize two devices where
KO/Pi, KA/Pi or PWM/Pi is installed, is the profile kind "Pi-Sync".
Details about that in 6) b).
In KDE-Pim/Pi you can synchronize ( sync ) your calendar/addressbook/
passwordfile with another calendar/addressbook/passwordfile,
by syncing your (local) calendar/addressbook/passwordfile
with a (remote) file.
This remote file may on your local filesystem
or on another (remote) device.
If you want to sync with another remote device, you have to create
a sync profile.
You have two choices for choosing the profil kind:
I) You can choose profile kind "Remote file" and specify a
command line download/upload command ( like scp, ftp, ...) to
a) download the remote file to your local machine to a temp file
b) sync with this temp file
c) upload the synced file to the remote device
II) If you want to sync with a device, where KO/Pi( or KA/Pi, PWM/Pi) is
installed, you can easily get the remote file via network
with the build in file transfer feature:
Choose profile kind "Pi-Sync" and
a) Start KO/Pi,KA/Pi or PWM/Pi on remote device and
enable "Pi-Sync" on remote device with password and port.
b) Specify password, port and IP address in your profile.
You can sync with your mobile phone as well.
Everything is explained in more details below.
NOTE:
If you do not use profile kind "Pi-Sync",
it is recommended to close
a running KO/Pi (KA/Pi, PWM/Pi) on the remote device.
(Note: KO/Pi(KA/Pi, PWM/Pi) running on Zaurus with
FastLoad enabled will never be closed!)
After syncing with a running KO/Pi on the remote device,
a "save" on the remote device will tell you that it needs to merge (sync).
After merging (just a syncing with the changed file)
you will get the new data showing in remote KO/Pi.
*************************************************************************
1) Qick overview of settings
*************************************************************************
a) Open sync settings dialog (Menu Synchronize - Configure...)
b) Give your device a unique name.
(unique in the set of all devices you want to sync with).
If you have already configured another devive and created
there a sync profile to sync with this device, give your device
the same name as this sync profile! The same name is important,
because it makes it possible to sync first A->B
(A local device, that performs the sync, B remote device)
and then B->A. Such that the B->A sync knows about the
already performed A->B sync.
That means: It is unimportant if you sync A->B or B->A,
the devices A and B will be synced properly.
c) Create a new sync profile and give it a unique name.
(unique in the set of all sync profiles on this device).
If you want to sync with a device, where KO/Pi is already installed
and which has a given unique device name, use this device name as
your profile name ( refer to b) ).
-d) Coose the profile kind of your syncing method:
+d) Choose the profile kind of your syncing method:
(i) Local file or
(ii) Pi-Sync or
(iii) Remote file or
(iiii) Mobile Phone.
Detailed explanation in 6)
e) Choose the other profile options.
Detailed explanation in 2)
f) Close sync dialog with OK.
g) Sync.
NOTE:
AFTER SYNCING THERE ARE "SYNC EVENTS" CREATED
(OR UPDATED, IF IT ALREADY EXITS) FOR EACH SYNC PROFILE.
YOU MAY NOT DELETE OR CHANGE THESE EVENTS.
*************************************************************************
2) Sync settings in sync dialog
*************************************************************************
a) Local device name:
-> 1) b)
b) Profile:
-> 1) c)
c) Multiple Sync options: Include in multiple sync:
In the Synchronize menu, there is a multiple sync menu entry.
If you choose this menu entry, all user defined profiles with this
'Include in multiple sync' option enabled will be synced
one after another. And this twice. This will take some time.
After that sync, on all devices should be the same data.
d)- j) Sync algo options:
d) Ask for preferences before sync:
Check this to be asked for "Sync preferences" settings before each sync.
If the profile kind is "Pi-Sync" you will be asked to confirm
the "Pi-Sync" specific settings (Password,IP address, port number)
as well. That makes it possible to use that profile for a
device that is connected via DHCP to the network and gets different
IP addresses when connecting to the network.
e) Sync preferences:
Choose here your sync preferences.
Details -> 4)
f) Show summary after sync:
Check this to get a small summary dialog after sync
about number of added/changed/deleted events on local/remote.
g) Apply filter when adding data to local:
What is a filter? You can read this in -> 5)
With this option you can specify a filter for events/contacts,
which should be added to the local database, because they are
in the remote database and not in the local database.
(Database = calendar file or addressbook file).
Note that the filter is NOT applied to the remote
database before syncing. It is only applied to a particular
item which should be added to the local database.
Well, but what is the difference?
The differnce is: If the remote database AND the local database contain
an already synced item, which does not match the filter, then this item is synced.
If the remote database contains an item which does not match the filter
and the local database does not contain this item, then this item is not added
to the local database, but it is still in the remote database after syncing.
g) Write back synced data:
Uncheck this to update the local calendar only.
I.e. your local calendar is synced with the remote calendar
but nothing on the remote calendar is changed.
If you uncheck "Write back synced data", the settings
under h) and i) are ignored, of course.
h) - j) Write back options:
h) Write back (on remote) existing entries only:
Check this to update the remote data only.
I.e. no data from yor local calendar/addressbook is added to the
remote device. You may use this option to
sync against some kind of "public calendar/addressbook" without
adding anything of your personal data.
But in this case, you cannot add an item to the remoet device.
i) Apply filter when adding data to remote:
What is a filter? You can read this in -> 5)
With this option you can specify a filter for events/contacts,
which should be added to the remote database, because they are
in the local database and not in the remote database.
(Database = calendar file or addressbook file).
Note that the filter is NOT applied to the local
database before syncing. It is only applied to a particular
item of the local database which should be added to the remote database.
Well, but what is the difference?
The differnce is: If the local database AND the remote database contain
an already synced item, which does not match the filter, then this item is synced.
If the local database contains an item which does not match the filter
and the remote database does not contain this item, then this item is not added
to the remote database, but it is still in the local database after syncing.
Example:
You have specified a calendar filter "only public events".
You specify this filter as the outgoing filter for syncing.
If there is an event in the local database which is not "public", but "private",
this event is not added to the remote database.
If there is an event in the local database and in the remote database which is
"private" (maybe added by someone else) then this event is synced and
it is in the local database and in the remote database after syncing.
That means in particular you cannot remove an event from the remote
database but setting it to "private".
If you want to remove the event you can clone it, set it to private and delete the
original event. Then the original event is deleted in the remote database after sync and
the cloned event is not added to the remote database, because it is private.
j) Write back (calendar) entries for time period only:
Check this to write back only calendar entries for a given time period.
(Useful when syncing with mobile phones.)
You can specify the date range in weeks for the weeks in the past to the weeks in the future.
k) Profile kind:
Details -> 6)
*************************************************************************
3) Syncing background
*************************************************************************
The same mentioned for calendars is valid for addressbooks as well.
Synchronizing calendars ( i.e. files ) means,
to merge two calendars in a useful way.
If the two calendars are completely different,
there is no problem, the resulting calendar contains
all data from the local and from the remote calendar.
Problems will occur, if you have edited items
from the local calendar on the remote machine.
Then it could be, that items are in conflict.
Two items are "in conflict", if they have the
same unique ID (which get an item at time of
creation and owns it until it is deleted )
and they both are modified after the last
synchronization.
At first sync of two calendars there is no item deleted.
If the calendars are synced before and there is an item,
which is not edited after the last sync and is only
available in one calendar, then this item is deleted
in this calendar.
But when was the last synchronization between two calendars?
To know that, KO/Pi creates at first syncing
of two files an unique event "<profile name> - sync Event"
on the remote and the local calendar.
After syncing, the start time of this event is set
to the time of syncing.
The event is read only and the user may not change it.
If two such files are synced, that both have an event
"<profile name> - sync Event" and the events have
the same start time, then deleted items on the one calendar
are deleted on the other as well.
*************************************************************************
4) Sync preferences
*************************************************************************
Two items are "in conflict", if they have the same unique ID
and they both are modified after the last synchronization.
(Details -> 3) ).
If an item is not modified after the last sync and
it is not found in the other calendar, it is deleted.
On the first sync, there is no item deleted.
SYNC PREFERENCES:
-Take local entry on conflict:
Takes the local entry on conflict.
If it is the first sync,
"Ask for every entry"
is chosen automatically,
if this is selected.
-Take remote entry on conflict:
Takes the remote entry on conflict.
If it is the first sync,
"Ask for every entry"
is chosen automatically,
if this is selected.
-Take newest entry on conflict:
This takes the newest entry on conflict.
May be the most useful syncing mode.
-Ask for every entry on conflict:
Pops up an event viewer dialog and
shows the two conflicting entries there.
The user can chose, which entry he would like to take.
The button for the newest entry
is automatically set as default button.
diff --git a/korganizer/kotodoviewitem.cpp b/korganizer/kotodoviewitem.cpp
index 347d982..ead8628 100644
--- a/korganizer/kotodoviewitem.cpp
+++ b/korganizer/kotodoviewitem.cpp
@@ -5,441 +5,441 @@
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <klocale.h>
#include <kdebug.h>
#include <qapp.h>
#include <kiconloader.h>
#include "kotodoviewitem.h"
#include "kotodoview.h"
#include "koprefs.h"
KOTodoViewItem::KOTodoViewItem( QListView *parent, Todo *todo, KOTodoView *kotodo)
: QCheckListItem( parent , "", CheckBox ), mTodo( todo ), mTodoView( kotodo )
{
construct();
}
KOTodoViewItem::KOTodoViewItem( KOTodoViewItem *parent, Todo *todo, KOTodoView *kotodo )
: QCheckListItem( parent, "", CheckBox ), mTodo( todo ), mTodoView( kotodo )
{
construct();
}
QString KOTodoViewItem::key(int column,bool) const
{
QMap<int,QString>::ConstIterator it = mKeyMap.find(column);
if (it == mKeyMap.end()) {
return text(column).lower();
} else {
return *it;
}
}
void KOTodoViewItem:: setup()
{
int h = 20;
if ( listView () ) {
QFontMetrics fm ( listView ()->font () );
h = fm.height();
}
setHeight( h );
}
void KOTodoViewItem::setSortKey(int column,const QString &key)
{
mKeyMap.insert(column,key);
}
#if QT_VERSION >= 300
void KOTodoViewItem::paintBranches(QPainter *p,const QColorGroup & cg,int w,
int y,int h)
{
QListViewItem::paintBranches(p,cg,w,y,h);
}
#else
#endif
void KOTodoViewItem::construct()
{
// qDebug("KOTodoViewItem::construct() ");
m_init = true;
QString keyd = "==";
QString keyt = "==";
QString skeyd = "==";
QString skeyt = "==";
setOn(mTodo->isCompleted());
setText(0,mTodo->summary());
setText(1,QString::number(mTodo->priority()));
setText(2,i18n("%1 %").arg(QString::number(mTodo->percentComplete())));
if (mTodo->percentComplete()<100) {
if (mTodo->isCompleted()) setSortKey(2,QString::number(999));
else setSortKey(2,QString::number(mTodo->percentComplete()));
}
else {
if (mTodo->isCompleted()) setSortKey(2,QString::number(999));
else setSortKey(2,QString::number(99));
}
if (mTodo->hasDueDate()) {
setText(3, mTodo->dtDueDateStr());
QDate d = mTodo->dtDue().date();
keyd.sprintf("%04d%02d%02d",d.year(),d.month(),d.day());
// setSortKey(3,keyd);
if (mTodo->doesFloat()) {
setText(4,"");
}
else {
setText(4,mTodo->dtDueTimeStr());
QTime t = mTodo->dtDue().time();
keyt.sprintf("%02d%02d",t.hour(),t.minute());
//setSortKey(4,keyt);
}
} else {
setText(3,"");
setText(4,"");
}
setSortKey(3,keyd);
setSortKey(4,keyt);
if (mTodo->isCompleted()) setSortKey(1,"6" + QString::number(mTodo->priority())+keyd+keyt);
else setSortKey(1,QString::number(mTodo->priority())+keyd+keyt);
if (mTodo->hasStartDate()) {
setText(5, mTodo->dtStartDateStr());
QDate d = mTodo->dtStart().date();
skeyd.sprintf("%04d%02d%02d",d.year(),d.month(),d.day());
if (mTodo->doesFloat()) {
setText(6,"");
}
else {
setText(6,mTodo->dtStartTimeStr());
QTime t = mTodo->dtStart().time();
skeyt.sprintf("%02d%02d",t.hour(),t.minute());
}
} else {
setText(5,"");
setText(6,"");
}
setSortKey(5,skeyd);
setSortKey(6,skeyt);
setText(7,mTodo->cancelled() ? i18n("Yes") : i18n("No"));
setText(8,mTodo->categoriesStr());
#if 0
// Find sort id in description. It's the text behind the last '#' character
// found in the description. White spaces are removed from beginning and end
// of sort id.
int pos = mTodo->description().findRev('#');
if (pos < 0) {
setText(6,"");
} else {
QString str = mTodo->description().mid(pos+1);
str.stripWhiteSpace();
setText(6,str);
}
#endif
m_known = false;
m_init = false;
setMyPixmap();
}
void KOTodoViewItem::setMyPixmap()
{
int size = 5;
QPixmap pixi = QPixmap( 1, 1 );
// if ( !mTodo->isCompleted() && mTodo->hasDueDate() && mTodo->dtDue() < QDateTime::currentDateTime() ) {
// pixi = SmallIcon("redcross16");
// } else {
QPainter p;
int pixSize = 0;
QPixmap pPix = QPixmap( size, size );
if ( mTodo->description().length() > 0 ) {
pixi.resize(size, pixSize+size);
pPix.fill( Qt::darkGreen );
p.begin( &pixi );
p. drawPixmap ( 0, pixSize, pPix);
p.end();
pixSize += size;
}
if ( mTodo->isAlarmEnabled() ) {
pixi.resize(size, pixSize+size);
pPix.fill( Qt::red );
p.begin( &pixi );
p. drawPixmap ( 0, pixSize, pPix);
p.end();
pixSize += size;
}
// }
if ( pixi.width() > 1 ) {
setPixmap ( 0,pixi ) ;
+ } else {
+ setPixmap ( 0,QPixmap() ) ;
}
-
-
}
void KOTodoViewItem::stateChange(bool state)
{
// qDebug("KOTodoViewItem::stateChange ");
// do not change setting on startup
if ( m_init ) return;
kdDebug() << "State changed, modified " << state << endl;
QString keyd = "==";
QString keyt = "==";
if (state) mTodo->setCompleted(state);
else mTodo->setPercentComplete(0);
if (isOn()!=state) {
setOn(state);
}
if (mTodo->hasDueDate()) {
setText(3, mTodo->dtDueDateStr());
QDate d = mTodo->dtDue().date();
keyd.sprintf("%04d%02d%02d",d.year(),d.month(),d.day());
setSortKey(3,keyd);
if (mTodo->doesFloat()) {
setText(4,"");
}
else {
setText(4,mTodo->dtDueTimeStr());
QTime t = mTodo->dtDue().time();
keyt.sprintf("%02d%02d",t.hour(),t.minute());
setSortKey(4,keyt);
}
}
if (mTodo->isCompleted()) setSortKey(1,QString::number(9)+keyd+keyt);
else setSortKey(1,QString::number(mTodo->priority())+keyd+keyt);
setText(2,i18n("%1 %").arg(QString::number(mTodo->percentComplete())));
if (mTodo->percentComplete()<100) {
if (mTodo->isCompleted()) setSortKey(2,QString::number(999));
else setSortKey(2,QString::number(mTodo->percentComplete()));
}
else {
if (mTodo->isCompleted()) setSortKey(2,QString::number(999));
else setSortKey(2,QString::number(99));
}
QListViewItem * myChild = firstChild();
KOTodoViewItem *item;
while( myChild ) {
item = static_cast<KOTodoViewItem*>(myChild);
item->stateChange(state);
myChild = myChild->nextSibling();
}
mTodoView->modified(true);
- mTodoView->setTodoModified( mTodo );
setMyPixmap();
+ mTodoView->setTodoModified( mTodo );
}
bool KOTodoViewItem::isAlternate()
{
#ifndef KORG_NOLVALTERNATION
KOTodoListView *lv = static_cast<KOTodoListView *>(listView());
if (lv && lv->alternateBackground().isValid())
{
KOTodoViewItem *above = 0;
above = dynamic_cast<KOTodoViewItem *>(itemAbove());
m_known = above ? above->m_known : true;
if (m_known)
{
m_odd = above ? !above->m_odd : false;
}
else
{
KOTodoViewItem *item;
bool previous = true;
if (QListViewItem::parent())
{
item = dynamic_cast<KOTodoViewItem *>(QListViewItem::parent());
if (item)
previous = item->m_odd;
item = dynamic_cast<KOTodoViewItem *>(QListViewItem::parent()->firstChild());
}
else
{
item = dynamic_cast<KOTodoViewItem *>(lv->firstChild());
}
while(item)
{
item->m_odd = previous = !previous;
item->m_known = true;
item = dynamic_cast<KOTodoViewItem *>(item->nextSibling());
}
}
return m_odd;
}
return false;
#else
return false;
#endif
}
void KOTodoViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment)
{
QColorGroup _cg = cg;
QColorGroup::ColorRole role;
if ( KOPrefs::instance()->mTodoViewUsesForegroundColor )
role = QColorGroup::Text;
else
role = QColorGroup::Base;
//#ifndef KORG_NOLVALTERNATION
// if (isAlternate())
// _cg.setColor(QColorGroup::Base, static_cast< KOTodoListView* >(listView())->alternateBackground());
bool setColor = KOPrefs::instance()->mTodoViewUsesCatColors;
QColor colorToSet;
if ( setColor ) {
QStringList categories = mTodo->categories();
QString cat = categories.first();
if ( !cat.isEmpty()) {
colorToSet = *(KOPrefs::instance()->categoryColor(cat) );
} else
setColor = false;
}
if (mTodo->hasDueDate()) {
if (mTodo->dtDue().date()==QDate::currentDate() &&
!mTodo->isCompleted()) {
//_cg.setColor( role , KOPrefs::instance()->mTodoDueTodayColor);
colorToSet = KOPrefs::instance()->mTodoDueTodayColor;
setColor = true;
}
if (mTodo->dtDue().date() < QDate::currentDate() &&
!mTodo->isCompleted()) {
//_cg.setColor( role, KOPrefs::instance()->mTodoOverdueColor);
colorToSet = KOPrefs::instance()->mTodoOverdueColor;
setColor = true;
}
}
if ( setColor ) {
_cg.setColor(role,colorToSet );
if ( role == QColorGroup::Base) {
int rgb = colorToSet.red();
rgb += colorToSet.blue()/2;
rgb += colorToSet.green();
if ( rgb < 200 )
_cg.setColor(QColorGroup::Text,Qt::white );
}
}
//#endif
if ( column > 0 ){
if ( column == 2 && !KOPrefs::instance()->mTodoViewShowsPercentage ) {
p->save();
int progress = (int)(( (width-6)*mTodo->percentComplete())/100.0 + 0.5);
p->fillRect( 0, 0, width, height(), _cg.base() ); // background
// p->setPen(Qt::black ); //border
// p->setBrush( KOPrefs::instance()->mHighlightColorKGlobalSettings::baseColor() ); //filling
QColor fc = KOPrefs::instance()->mHighlightColor;
if ( mTodo->percentComplete() == 100 )
fc = darkGreen;
p->drawRect( 2, 2, width-4, height()-4);
p->fillRect( 3, 3, progress, height()-6,
fc );
p->restore();
} else {
QCheckListItem::paintCell(p, _cg, column, width, alignment);
}
return;
}
int align = alignment;
if ( !p )
return;
p->fillRect( 0, 0, width, height(), _cg.brush( QColorGroup::Base ) );
QListView *lv = listView();
if ( !lv )
return;
int marg = 2;//lv->itemMargin();
int r = 0;
QCheckListItem::Type myType = QCheckListItem::CheckBox;
int BoxSize = 20;
int boxOffset = 2;
int xOffset = 2;
if (qApp->desktop()->width() < 300 ) {
BoxSize = 14;
boxOffset = -1;
xOffset = 1;
// marg = 0;
}
if ( height() < BoxSize ) {
boxOffset = boxOffset - ((BoxSize - height())/2) ;
// qDebug("boxOffset %d height %d", boxOffset, height() );
BoxSize = height();
}
//bool winStyle = lv->style() == WindowsStyle;
int lineStart = 5;
if ( myType == Controller ) {
if ( !pixmap( 0 ) )
r += BoxSize + 4;
} else {
ASSERT( lv ); //###
// QFontMetrics fm( lv->font() );
// int d = fm.height();
int x = 0;
int y = (height() - BoxSize) / 2;
// p->setPen( QPen( _cg.text(), winStyle ? 2 : 1 ) );
if ( myType == CheckBox ) {
if ( isEnabled() )
p->setPen( QPen( _cg.text(), 1 ) );
else
p->setPen( QPen( listView()->palette().color( QPalette::Disabled, QColorGroup::Text ), 1 ) );
p->drawRect( x+marg, y+2, BoxSize-4, BoxSize-4 );
lineStart = x+marg;
/////////////////////
x++;
y++;
if ( isOn() ) {
QPointArray a( 7*2 );
int i, xx, yy;
xx = x+xOffset+marg+(boxOffset/2);
yy = y+5+boxOffset;
for ( i=0; i<3; i++ ) {
a.setPoint( 2*i, xx, yy );
a.setPoint( 2*i+1, xx, yy+2 );
// qDebug(" ");
xx++; yy++;
}
yy -= 2;
for ( i=3; i<7; i++ ) {
a.setPoint( 2*i, xx, yy );
a.setPoint( 2*i+1, xx, yy+2 );
xx++; yy--;
}
p->setPen( darkGreen );
p->drawLineSegments( a );
}
////////////////////////
}
r += BoxSize + 4;
}
p->translate( r, 0 );
p->setPen( QPen( _cg.text() ) );
diff --git a/microkde/kdeui/klistview.cpp b/microkde/kdeui/klistview.cpp
index 6859d36..154cd02 100644
--- a/microkde/kdeui/klistview.cpp
+++ b/microkde/kdeui/klistview.cpp
@@ -1720,387 +1720,395 @@ void KListView::fileManagerKeyPressEvent (QKeyEvent* e)
for (int i=0; i<items; i++)
{
if (shiftOrCtrl)
nextItem->setSelected(!nextItem->isSelected());
//the end
if ((i==items-1) || (nextItem->itemBelow()==0))
{
if (shiftOrCtrl)
nextItem->setSelected(!nextItem->isSelected());
if (d->selectedBySimpleMove)
nextItem->setSelected(true);
ensureItemVisible(nextItem);
setCurrentItem(nextItem);
update();
if ((shiftOrCtrl) || (d->selectedBySimpleMove))
{
emit selectionChanged();
}
return;
}
nextItem=nextItem->itemBelow();
}
break;
case Key_Prior:
items=visibleHeight()/item->height();
nextItem=item;
if (d->selectedBySimpleMove)
item->setSelected(false);
if (shiftOrCtrl)
{
d->selectionDirection=-1;
d->selectedBySimpleMove=false;
};
for (int i=0; i<items; i++)
{
if ((nextItem!=item) &&(shiftOrCtrl))
nextItem->setSelected(!nextItem->isSelected());
//the end
if ((i==items-1) || (nextItem->itemAbove()==0))
{
if (d->selectedBySimpleMove)
nextItem->setSelected(true);
ensureItemVisible(nextItem);
setCurrentItem(nextItem);
update();
if ((shiftOrCtrl) || (d->selectedBySimpleMove))
{
emit selectionChanged();
}
return;
}
nextItem=nextItem->itemAbove();
}
break;
case Key_Minus:
if ( item->isOpen() )
setOpen( item, FALSE );
break;
case Key_Plus:
if ( !item->isOpen() && (item->isExpandable() || item->childCount()) )
setOpen( item, TRUE );
break;
default:
bool realKey = ((e->key()!=Key_Shift) && (e->key()!=Key_Control)
&& (e->key()!=Key_Meta) && (e->key()!=Key_Alt));
bool selectCurrentItem = (d->selectedBySimpleMove) && (item->isSelected());
if (realKey && selectCurrentItem)
item->setSelected(false);
//this is mainly for the "goto filename beginning with pressed char" feature (aleXXX)
QListView::SelectionMode oldSelectionMode = selectionMode();
setSelectionMode (QListView::Multi);
QListView::keyPressEvent (e);
setSelectionMode (oldSelectionMode);
if (realKey && selectCurrentItem)
{
currentItem()->setSelected(true);
emitSelectionChanged=TRUE;
}
repaintItem2=currentItem();
if (realKey)
visItem=currentItem();
break;
}
if (visItem)
ensureItemVisible(visItem);
QRect ir;
if (repaintItem1)
ir = ir.unite( itemRect(repaintItem1) );
if (repaintItem2)
ir = ir.unite( itemRect(repaintItem2) );
if ( !ir.isEmpty() )
{ // rectangle to be repainted
if ( ir.x() < 0 )
ir.moveBy( -ir.x(), 0 );
viewport()->repaint( ir, FALSE );
}
/*if (repaintItem1)
repaintItem1->repaint();
if (repaintItem2)
repaintItem2->repaint();*/
update();
if (emitSelectionChanged)
emit selectionChanged();
}
void KListView::setSelectionModeExt (SelectionModeExt mode)
{
d->selectionMode = mode;
switch (mode)
{
case Single:
case Multi:
case Extended:
case NoSelection:
setSelectionMode (static_cast<QListView::SelectionMode>(static_cast<int>(mode)));
break;
case FileManager:
setSelectionMode (QListView::Extended);
break;
default:
kdWarning () << "Warning: illegal selection mode " << int(mode) << " set!" << endl;
break;
}
}
KListView::SelectionModeExt KListView::selectionModeExt () const
{
return d->selectionMode;
}
int KListView::itemIndex( const QListViewItem *item ) const
{
if ( !item )
return -1;
if ( item == firstChild() )
return 0;
else {
QListViewItemIterator it(firstChild());
uint j = 0;
for (; it.current() && it.current() != item; ++it, ++j );
if( !it.current() )
return -1;
return j;
}
}
QListViewItem* KListView::itemAtIndex(int index)
{
if (index<0)
return 0;
int j(0);
for (QListViewItemIterator it=firstChild(); it.current(); it++)
{
if (j==index)
return it.current();
j++;
};
return 0;
}
void KListView::emitContextMenu (KListView*, QListViewItem* i)
{
QPoint p;
// qDebug("KListView::emitContextMenu ");
if (i)
p = viewport()->mapToGlobal(itemRect(i).center());
else
p = mapToGlobal(rect().center());
emit contextMenu (this, i, p);
}
void KListView::emitContextMenu (QListViewItem* i, const QPoint& p, int col)
{
- // qDebug("KListView::emitContextMenu col");
- emit contextRequest( i, p, col );
- emit contextMenu (this, i, p);
+ QListViewItem* item = i;
+ int c = col;
+ // do not trust the values for QListViewItem* i and int col;
+ // qDebug("KListView::emitContextMenu col");
+ if ( col == -1 ) {
+ QPoint pp = viewport()->mapFromGlobal(p);
+ item = itemAt( pp);
+ c = header()->sectionAt(pp.x() );
+ }
+ emit contextRequest( item, p, c );
+ emit contextMenu (this, item, p);
}
void KListView::setAcceptDrops (bool val)
{
QListView::setAcceptDrops (val);
viewport()->setAcceptDrops (val);
}
int KListView::dropVisualizerWidth () const
{
return d->mDropVisualizerWidth;
}
void KListView::viewportPaintEvent(QPaintEvent *e)
{
QListView::viewportPaintEvent(e);
if (d->mOldDropVisualizer.isValid() && e->rect().intersects(d->mOldDropVisualizer))
{
QPainter painter(viewport());
// This is where we actually draw the drop-visualizer
painter.fillRect(d->mOldDropVisualizer, Dense4Pattern);
}
if (d->mOldDropHighlighter.isValid() && e->rect().intersects(d->mOldDropHighlighter))
{
QPainter painter(viewport());
qDebug("KListView::viewportPaintEvent has to be verified");
// This is where we actually draw the drop-highlighter
//US style().drawPrimitive(QStyle::PE_FocusRect, &painter, d->mOldDropHighlighter, colorGroup(),
//US QStyle::Style_FocusAtBorder);
//LR style().drawFocusRect(&painter, d->mOldDropHighlighter, colorGroup(), (const QColor*)0, true);
}
}
void KListView::setFullWidth()
{
setFullWidth(true);
}
void KListView::setFullWidth(bool fullWidth)
{
d->fullWidth = fullWidth;
//US header()->setStretchEnabled(fullWidth, columns()-1);
}
bool KListView::fullWidth() const
{
return d->fullWidth;
}
int KListView::addColumn(const QString& label, int width)
{
int result = QListView::addColumn(label, width);
if (d->fullWidth) {
//US header()->setStretchEnabled(false, columns()-2);
//US header()->setStretchEnabled(true, columns()-1);
}
return result;
}
int KListView::addColumn(const QIconSet& iconset, const QString& label, int width)
{
int result = QListView::addColumn(iconset, label, width);
if (d->fullWidth) {
//US header()->setStretchEnabled(false, columns()-2);
//US header()->setStretchEnabled(true, columns()-1);
}
return result;
}
void KListView::removeColumn(int index)
{
QListView::removeColumn(index);
//US if (d->fullWidth && index == columns()) header()->setStretchEnabled(true, columns()-1);
}
void KListView::viewportResizeEvent(QResizeEvent* e)
{
QListView::viewportResizeEvent(e);
}
const QColor &KListView::alternateBackground() const
{
return d->alternateBackground;
}
void KListView::setAlternateBackground(const QColor &c)
{
d->alternateBackground = c;
repaint();
}
void KListView::saveLayout(KConfig *config, const QString &group) const
{
KConfigGroupSaver saver(config, group);
QStringList widths, order;
for (int i = 0; i < columns(); ++i)
{
widths << QString::number(columnWidth(i));
order << QString::number(header()->mapToIndex(i));
}
config->writeEntry("ColumnWidths", widths);
config->writeEntry("ColumnOrder", order);
config->writeEntry("SortColumn", d->sortColumn);
config->writeEntry("SortAscending", d->sortAscending);
}
void KListView::restoreLayout(KConfig *config, const QString &group)
{
KConfigGroupSaver saver(config, group);
QStringList cols = config->readListEntry("ColumnWidths");
int i = 0;
for (QStringList::ConstIterator it = cols.begin(); it != cols.end(); ++it)
setColumnWidth(i++, (*it).toInt());
cols = config->readListEntry("ColumnOrder");
i = 0;
for (QStringList::ConstIterator it = cols.begin(); it != cols.end(); ++it)
header()->moveSection(i++, (*it).toInt());
/*US I changed the following code, because hasKey is not available.
!!! check if my version is correct
if (config->hasKey("SortColumn"))
setSorting(config->readNumEntry("SortColumn"), config->readBoolEntry("SortAscending", true));
*/
QStringList langLst = config->readListEntry( "SortColumn" );
if (!langLst.isEmpty())
setSorting(config->readNumEntry("SortColumn"), config->readBoolEntry("SortAscending", true));
}
void KListView::setSorting(int column, bool ascending)
{
d->sortColumn = column;
d->sortAscending = ascending;
QListView::setSorting(column, ascending);
}
int KListView::columnSorted(void) const
{
return d->sortColumn;
}
bool KListView::ascendingSort(void) const
{
return d->sortAscending;
}
KListViewItem::KListViewItem(QListView *parent)
: QListViewItem(parent)
{
init();
}
KListViewItem::KListViewItem(QListViewItem *parent)
: QListViewItem(parent)
{
init();
}
KListViewItem::KListViewItem(QListView *parent, QListViewItem *after)
: QListViewItem(parent, after)
{
init();
}
KListViewItem::KListViewItem(QListViewItem *parent, QListViewItem *after)
: QListViewItem(parent, after)
{
init();
}
KListViewItem::KListViewItem(QListView *parent,
QString label1, QString label2, QString label3, QString label4,
QString label5, QString label6, QString label7, QString label8)
: QListViewItem(parent, label1, label2, label3, label4, label5, label6, label7, label8)
{
init();
}
KListViewItem::KListViewItem(QListViewItem *parent,
QString label1, QString label2, QString label3, QString label4,
QString label5, QString label6, QString label7, QString label8)
: QListViewItem(parent, label1, label2, label3, label4, label5, label6, label7, label8)
{
init();
diff --git a/version b/version
index dedf950..02b0fb1 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-version = "1.9.19";
+version = "1.9.20";