[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kopete-devel
Subject:    Re: Review Request: Group Offline contacts into a separate group "Offline Users"
From:       Pali =?ISO-8859-1?Q?Roh=E1r?= <pali.rohar () gmail ! com>
Date:       2012-02-25 19:58:33
Message-ID: 1340695.efhcWEsLza () pali
[Download RAW message or body]

[Attachment #2 (multipart/signed)]

[Attachment #4 (multipart/mixed)]


Here is updated patch which apply on kopete from trunk.

On Sunday 04 July 2010 02:14:47 Raphael Kubo da Costa wrote:
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://reviewboard.kde.org/r/2179/#review6362
> -----------------------------------------------------------
> 
> 
> Well, nobody has given a NACK yet, so I presume this is a tacit ACK :)
> 
> Does this patch still apply fine to trunk? It'd be good to apply it now that
> trunk is unfrozen for SC 4.6.
> 
> - Raphael
> 
> On 2009-11-18 04:12:17, Barry Carter wrote:
> > -----------------------------------------------------------
> > This is an automatically generated e-mail. To reply, visit:
> > http://reviewboard.kde.org/r/2179/
> > -----------------------------------------------------------
> > 
> > (Updated 2009-11-18 04:12:17)
> > 
> > 
> > Review request for Kopete.
> > 
> > 
> > Summary
> > -------
> > 
> > This patch allows a new configuration option to be set which will show all
> > offline users grouped into a folder called "Offline Users".
> > 
> > When a contact comes online, the metacontact is removed from the offline
> > group, and added to the normal group folder. Likewise when the contact
> > goes offline, the contact is added to the offline users folder.
> > 
> > Rules:
> > If "Show Offline" is set, then the offline folder group is removed from
> > view. If a search is in progress, the offline folder is removed from
> > view. Using the proxyfilter lessThan, the Offline folder is always pushed
> > to the bottom of the list.
> > 
> > Protection:
> > Removed right click access to the folder so no renaming etc can be done
> > (wise?). Removed ability for a user to move a contact to the offline
> > folder.
> > 
> > Side Effects:
> > The offline users folder is always visible even when not connected to a
> > network.
> > 
> > Implementation:
> > The offline folder is a "special" group like temporary or toplevel. This
> > allows it to hide away from the group menus while still being filterable.
> > 
> > Future:
> > Assuming anyone is interested in this feature, there are a couple of
> > cosmetic changes that might be made. One is... The offline folder will
> > never have an online contact, so instead of showing "Offline Users
> > (0/1000)" it could be abbreviated to "Offline Users (1000)"
> > 
> > Questions:
> > If we simply call the folder "Offline" would we get better i18n?
> > Is there a better way to do this?
> > 
> > built against 0.80.2
> > 
> > 
> > Diffs
> > -----
> > 
> >   /branches/KDE/4.3/kdenetwork/kopete/kopete/config/appearance/appearancec
> >   onfig_contactlist.ui 1046954
> >   /branches/KDE/4.3/kdenetwork/kopete/kopete/contactlist/contactlistproxy
> >   model.cpp 1046954
> >   /branches/KDE/4.3/kdenetwork/kopete/kopete/contactlist/contactlisttreem
> >   odel.cpp 1046954
> >   /branches/KDE/4.3/kdenetwork/kopete/kopete/contactlist/kopetecontactlis
> >   tview.cpp 1046954
> >   /branches/KDE/4.3/kdenetwork/kopete/kopete/contactlist/kopeteitemdelega
> >   te.cpp 1046954
> >   /branches/KDE/4.3/kdenetwork/kopete/libkopete/contactlist/kopetecontact
> >   liststorage.cpp 1046954
> >   /branches/KDE/4.3/kdenetwork/kopete/libkopete/contactlist/xmlcontactsto
> >   rage.cpp 1046954
> >   /branches/KDE/4.3/kdenetwork/kopete/libkopete/kopeteappearancesettings.
> >   kcfg 1046954
> >   /branches/KDE/4.3/kdenetwork/kopete/libkopete/kopetecontactlist.cpp
> >   1046954 /branches/KDE/4.3/kdenetwork/kopete/libkopete/kopetegroup.h
> >   1046954 /branches/KDE/4.3/kdenetwork/kopete/libkopete/kopetegroup.cpp
> >   1046954
> >   /branches/KDE/4.3/kdenetwork/kopete/libkopete/kopetemetacontact.cpp
> >   1046954> 
> > Diff: http://reviewboard.kde.org/r/2179/diff
> > 
> > 
> > Testing
> > -------
> > 
> > Tested against 0.80.2 in /branches/KDE/4.3/kdenetwork/
> > 
> > 
> > Screenshots
> > -----------
> > 
> > Offline Users
> > 
> >   http://reviewboard.kde.org/r/2179/s/262/
> > 
> > Show offline contacts in a separate folder
> > 
> >   http://reviewboard.kde.org/r/2179/s/265/
> > 
> > Offline Users cleanup
> > 
> >   http://reviewboard.kde.org/r/2179/s/266/
> > 
> > Thanks,
> > 
> > Barry

-- 
Pali Rohár
pali.rohar@gmail.com
["offline_group_new.patch" (offline_group_new.patch)]

Index: kopete/kopete/contactlist/contactlistproxymodel.cpp
===================================================================
--- kopete/kopete/contactlist/contactlistproxymodel.cpp	(revision 1282230)
+++ kopete/kopete/contactlist/contactlistproxymodel.cpp	(working copy)
@@ -79,6 +79,15 @@
 		default:
 			QString leftName = left.data( Qt::DisplayRole ).toString();
 			QString rightName = right.data( Qt::DisplayRole ).toString();
+
+			// Force the offline group to the bottom
+			QObject* groupObjectLeft = qVariantValue<QObject*>( sourceModel()->data( left, \
Kopete::Items::ObjectRole ) ); +			QObject* groupObjectRight = \
qVariantValue<QObject*>( sourceModel()->data( right, Kopete::Items::ObjectRole ) ); +
+			if ( groupObjectLeft == Kopete::Group::offline() )
+				return false;
+			else if ( groupObjectRight == Kopete::Group::offline() )
+				return true;
 			return QString::localeAwareCompare( leftName, rightName ) < 0;
 		}
 	}
@@ -130,6 +139,10 @@
 		int connectedContactsCount = model->data( current, \
Kopete::Items::ConnectedCountRole ).toInt();  int totalContactsCount = model->data( \
current, Kopete::Items::TotalCountRole ).toInt();  
+		bool isOfflineGroup = ( groupObject == Kopete::Group::offline() );
+		if ( !filterRegExp().isEmpty() && isOfflineGroup )
+			return false;
+
 		if ( !filterRegExp().isEmpty() )
 		{
 			// This shows or hides the contacts group folder if something was found.
@@ -158,12 +171,19 @@
 		}
 
 
-		if ( !showEmpty && totalContactsCount == 0 )
+		if ( !Kopete::AppearanceSettings::self()->showOfflineGrouped() && isOfflineGroup )
 			return false;
 
-		if ( !showEmpty && !showOffline && connectedContactsCount == 0 )
+		if ( !showEmpty && totalContactsCount == 0 && !isOfflineGroup)
 			return false;
 
+		// dont display offline when viewing in grouped offline mode
+		if ( showOffline && isOfflineGroup )
+			return false;
+
+		if ( !showEmpty && !showOffline && connectedContactsCount == 0 && !isOfflineGroup \
) +			return false;
+
 		return true;
 	}
 
@@ -178,6 +198,17 @@
 			return searchContactInfo( mc, filterRegExp() );
 		}
 
+		// Get the MetaContacts parent group name
+		QObject* groupObject = qVariantValue<QObject*>( model->data( sourceParent, \
Kopete::Items::ObjectRole ) ); +
+		if ( Kopete::AppearanceSettings::self()->groupContactByGroup() && \
qobject_cast<Kopete::Group*>(groupObject) != 0 ) +		{
+			// If this contact's group is called Offline, and we are not globally 
+			// showing offline all users show the offline folder
+			if ( groupObject == Kopete::Group::offline() )
+				return !showOffline;
+		}
+
 		bool alwaysVisible = model->data( current, Kopete::Items::AlwaysVisible \
).toBool();  int mcStatus = model->data( current, Kopete::Items::OnlineStatusRole \
).toInt();  if ( mcStatus <= OnlineStatus::Offline && !showOffline && !alwaysVisible \
                )
Index: kopete/kopete/contactlist/contactlisttreemodel.cpp
===================================================================
--- kopete/kopete/contactlist/contactlisttreemodel.cpp	(revision 1282230)
+++ kopete/kopete/contactlist/contactlisttreemodel.cpp	(working copy)
@@ -57,6 +57,14 @@
 
 	foreach( Kopete::Group* g, contact->groups() )
 		addMetaContactToGroup( contact, g );
+
+	if (  Kopete::AppearanceSettings::self()->showOfflineGrouped() )
+	{
+		if ( !contact->isOnline() )
+			addMetaContactToGroup( contact, Kopete::Group::offline() );
+		else
+			removeMetaContactFromGroup( contact, Kopete::Group::offline() );
+	}
 }
 
 void ContactListTreeModel::removeMetaContact( Kopete::MetaContact* contact )
@@ -273,7 +281,10 @@
 		switch ( role )
 		{
 		case Qt::DisplayRole:
-			return i18n( "%1 (%2/%3)", g->displayName(), countConnected( gmi ), gmi->count() \
); +			if ( g == Kopete::Group::offline() )
+				return i18n( "%1 (%2)", g->displayName(), gmi->count() );
+			else
+				return i18n( "%1 (%2/%3)", g->displayName(), countConnected( gmi ), gmi->count() \
);  break;
 		case Qt::DecorationRole:
 			if ( g->isExpanded() )
@@ -585,6 +596,11 @@
 	// and now notify all the changes
 	foreach(QModelIndex index, indexList)
 	{
+		if ( !mc->isOnline() )
+			addMetaContactToGroup( mc, Kopete::Group::offline() );
+		else
+			removeMetaContactFromGroup( mc, Kopete::Group::offline() );
+
 		// we need to emit the dataChanged signal to the groups this metacontact belongs \
to  // so that proxy filtering is aware of the changes, first we have to update the \
parent  // otherwise the group won't be expandable.
Index: kopete/kopete/contactlist/kopeteitemdelegate.cpp
===================================================================
--- kopete/kopete/contactlist/kopeteitemdelegate.cpp	(revision 1282230)
+++ kopete/kopete/contactlist/kopeteitemdelegate.cpp	(working copy)
@@ -188,7 +188,8 @@
 
 QList<Kopete::Contact*> KopeteItemDelegate::filterContacts( const \
QList<Kopete::Contact*> contacts ) const  {
-	if ( Kopete::AppearanceSettings::self()->showOfflineUsers() )
+	if ( Kopete::AppearanceSettings::self()->showOfflineUsers() ||
+		Kopete::AppearanceSettings::self()->showOfflineGrouped() )
 		return contacts;
 
 	QAbstractItemView* itemView = qobject_cast<QAbstractItemView*>(parent());
Index: kopete/kopete/contactlist/kopetecontactlistview.cpp
===================================================================
--- kopete/kopete/contactlist/kopetecontactlistview.cpp	(revision 1282230)
+++ kopete/kopete/contactlist/kopetecontactlistview.cpp	(working copy)
@@ -368,6 +368,10 @@
 			if ( group == Kopete::Group::topLevel() )
 				continue;
 
+			// Can't remove the offline group
+			if ( group == Kopete::Group::offline() )
+				continue;
+
 			groupList.append( group );
 
 			if( !group->displayName().isEmpty() )
@@ -453,6 +457,10 @@
 		QObject* groupObject = qVariantValue<QObject*>( index.data( \
Kopete::Items::MetaContactGroupRole ) );  Kopete::Group* fromGroup = \
qobject_cast<Kopete::Group*>(groupObject);  
+		// Can't move to the offline group manually
+		if ( toGroup == Kopete::Group::offline() )
+		    return;
+
 		metaContact->moveToGroup( fromGroup, toGroup );
 	}
 }
@@ -483,6 +491,10 @@
 		if ( !toGroup )
 			return;
 
+		// Can't copy to the offline group manually
+		if ( toGroup == Kopete::Group::offline() )
+		    return;
+
 		metaContact->addToGroup( toGroup );
 	}
 }
@@ -1010,6 +1022,9 @@
 		return;
 	}
 
+	if ( group == Kopete::Group::offline() )
+	    return;
+
 	KMenu *popup = dynamic_cast<KMenu *>( window->factory()->container( "group_popup", \
window ) );  if ( popup )
 	{
Index: kopete/kopete/config/appearance/appearanceconfig_contactlist.ui
===================================================================
--- kopete/kopete/config/appearance/appearanceconfig_contactlist.ui	(revision \
                1282230)
+++ kopete/kopete/config/appearance/appearanceconfig_contactlist.ui	(working copy)
@@ -189,6 +189,19 @@
     </widget>
    </item>
    <item>
+    <widget class="QCheckBox" name="kcfg_showOfflineGrouped">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Show offline contacts in a &amp;separate folder</string>
+     </property>
+    </widget>
+   </item>
+   <item>
     <widget class="QCheckBox" name="kcfg_contactListTreeView">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
Index: kopete/libkopete/kopetegroup.h
===================================================================
--- kopete/libkopete/kopetegroup.h	(revision 1282230)
+++ kopete/libkopete/kopetegroup.h	(working copy)
@@ -53,7 +53,7 @@
 	typedef QList<Group*> List;
 
 	/** Kinds of groups. */
-	enum GroupType { Normal=0, Temporary, TopLevel };
+	enum GroupType { Normal=0, Temporary, TopLevel, Offline };
 
 	/**
 	 * \brief Create an empty group
@@ -122,8 +122,13 @@
 	 * \return a Group pointer to the temporary group
 	 */
 	static Group *temporary();
-	
+
 	/**
+	 * \return a Group pointer to the offline group
+	 */
+	static Group *offline();
+
+	/**
 	 * @internal
 	 */
 	void setGroupId( uint groupId );
@@ -162,10 +167,11 @@
 
 	static Group *s_topLevel;
 	static Group *s_temporary;
+	static Group *s_offline;
 
 	class Private;
 	Private * const d;
-	
+
 	/**
 	 * @internal  used to get reachabe contact to send message to thom.
 	 */
Index: kopete/libkopete/kopetegroup.cpp
===================================================================
--- kopete/libkopete/kopetegroup.cpp	(revision 1282230)
+++ kopete/libkopete/kopetegroup.cpp	(working copy)
@@ -31,6 +31,7 @@
 
 Group *Group::s_topLevel  = 0L;
 Group *Group::s_temporary = 0L;
+Group *Group::s_offline = 0L;
 Group * Group::topLevel()
 {
 	if ( !s_topLevel )
@@ -47,6 +48,14 @@
 	return s_temporary;
 }
 
+Group * Group::offline()
+{
+	if ( !s_offline )
+		s_offline = new Group( i18n( "Offline Users" ), Group::Offline );
+
+	return s_offline;
+}
+
 uint Group::Private::uniqueGroupId = 0;
 
 Group::Group( const QString &_name )
@@ -81,6 +90,8 @@
 		s_topLevel=0L;
 	if(d->type == Temporary)
 		s_temporary=0L;
+	if(d->type == Offline)
+		s_offline=0L;
 	delete d;
 }
 
Index: kopete/libkopete/contactlist/xmlcontactstorage.cpp
===================================================================
--- kopete/libkopete/contactlist/xmlcontactstorage.cpp	(revision 1282230)
+++ kopete/libkopete/contactlist/xmlcontactstorage.cpp	(working copy)
@@ -506,7 +506,7 @@
     }
 
     // Don't overwrite type for Temporary and TopLevel groups
-    if ( group->type() != Kopete::Group::Temporary && group->type() != \
Kopete::Group::TopLevel ) +    if ( group->type() != Kopete::Group::Temporary && \
group->type() != Kopete::Group::TopLevel && group->type() != Kopete::Group::Offline ) \
                {
         QString type = element.attribute( QLatin1String( "type" ), QLatin1String( \
"standard" ) );  if ( type == QLatin1String( "temporary" ) )
@@ -525,6 +525,14 @@
                 return false;
             }
         }
+        else if ( type == QLatin1String( "offline" ) )
+        {
+            if ( group->type() != Kopete::Group::Offline )
+            {
+                parseGroup( Kopete::Group::offline(), element );
+                return false;
+            }
+        }
     }
 
     QString view = element.attribute( QLatin1String( "view" ), QLatin1String( \
"expanded" ) ); @@ -561,6 +569,9 @@
             case Kopete::Group::TopLevel:
                 group->setDisplayName( QLatin1String( "Top-Level" ) );
                 break;
+            case Kopete::Group::Offline:
+                group->setDisplayName( QLatin1String( "Offline" ) );
+                break;
             default:
                 group->setLoading( false );
                 return false;
@@ -748,6 +759,10 @@
         case Kopete::Group::TopLevel:
             type = QLatin1String( "top-level" );
             break;
+        case Kopete::Group::Offline:
+            type = QLatin1String( "offline" );
+            break;
+
         default:
             type = QLatin1String( "standard" ); // == Normal
             break;
Index: kopete/libkopete/contactlist/kopetecontactliststorage.cpp
===================================================================
--- kopete/libkopete/contactlist/kopetecontactliststorage.cpp	(revision 1282230)
+++ kopete/libkopete/contactlist/kopetecontactliststorage.cpp	(working copy)
@@ -80,6 +80,8 @@
         return Kopete::Group::temporary();
     if( type == Kopete::Group::TopLevel )
         return Kopete::Group::topLevel();
+    if( type == Kopete::Group::Offline )
+        return Kopete::Group::offline();
 
     foreach( Kopete::Group * group, d->groupList )
     {
Index: kopete/libkopete/kopeteappearancesettings.kcfg
===================================================================
--- kopete/libkopete/kopeteappearancesettings.kcfg	(revision 1282230)
+++ kopete/libkopete/kopeteappearancesettings.kcfg	(working copy)
@@ -250,10 +250,14 @@
 			<default>false</default>
 			<emit signal="contactListAppearanceChanged" />
 		</entry>
-
 		<entry key="showIdentityIcons" type="Bool">
 			<label>Show identities in status bar instead of accounts.</label>
 			<default>true</default>
 		</entry>
+		<entry key="showOfflineGrouped" type="Bool">
+			<label>Show offline users in a seperate group.</label>
+			<default>false</default>
+			<emit signal="contactListAppearanceChanged" />
+		</entry>
 	</group>
 </kcfg>
Index: kopete/libkopete/kopetecontactlist.cpp
===================================================================
--- kopete/libkopete/kopetecontactlist.cpp	(revision 1282230)
+++ kopete/libkopete/kopetecontactlist.cpp	(working copy)
@@ -198,7 +198,9 @@
 		return Group::temporary();
 	if( type == Group::TopLevel )
 		return Group::topLevel();
-	
+	if( type == Group::Offline )
+		return Group::offline();
+
 	if ( displayName == i18n ("Top Level") )
 		return Group::topLevel();
 
Index: kopete/libkopete/kopetemetacontact.cpp
===================================================================
--- kopete/libkopete/kopetemetacontact.cpp	(revision 1282230)
+++ kopete/libkopete/kopetemetacontact.cpp	(working copy)
@@ -995,6 +995,9 @@
 		return;
 	}
 
+	if ( to->type() == Group::Offline )
+		return;
+
 	if ( isTemporary() && to->type() != Group::Temporary )
 		return;
 


["signature.asc" (application/pgp-signature)]

_______________________________________________
kopete-devel mailing list
kopete-devel@kde.org
https://mail.kde.org/mailman/listinfo/kopete-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic