[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Devel] kschoolmenu



Petter Reinholdtsen wrote:

[Tim Vandermeersch]

At debcamp/debconf one of the skolelinux developers asked me if I
could finish the kschoolmenu program, wich I did.


Good to see that you are active developing. :)


But isn't it better if you commit your changes directly into the
Skolelinux CVS, or send some patches instead of a new version of the
source?


I attached the new version to this email, If something needs to be
changed, let me know.


Please do not send large binary files as attachments to mailing lists.





I won't attach any large binary files anymore...

Klaus Ada Johnstad asked if this version works with kde 3.1. The first version I posted to the mailing list didn't work with kde 3.1, that's why I post this version wich works with kde 3.1.

The reason why I post the changes to the mailinglist is that I want to know what you think of it before I actually commit the changes into the skolelinux CVS.

Is there an irc channel for skolelinux?

Tim

diff -ru skolelinux-orig/src/kschoolmenu/Xsession.d/25kschoolmenu-kdedirs skolelinux/src/kschoolmenu/Xsession.d/25kschoolmenu-kdedirs
--- skolelinux-orig/src/kschoolmenu/Xsession.d/25kschoolmenu-kdedirs	2003-04-22 03:01:59.000000000 +0200
+++ skolelinux/src/kschoolmenu/Xsession.d/25kschoolmenu-kdedirs	2003-07-24 16:18:57.000000000 +0200
@@ -1,5 +1,3 @@
-#!/bin/bash
-
 KDEDIRS_ORG="$KDEDIRS"
 KDEDIRS=""
 
diff -ru skolelinux-orig/src/kschoolmenu/configure skolelinux/src/kschoolmenu/configure
--- skolelinux-orig/src/kschoolmenu/configure	2003-04-22 08:42:19.000000000 +0200
+++ skolelinux/src/kschoolmenu/configure	2003-07-24 21:33:50.000000000 +0200
@@ -4100,7 +4100,7 @@
   
 
 
-if test -z "2"; then
+if test -e "/usr/lib/kde3"; then
   kde_qtver=3
   kde_qtsubver=1
 else
@@ -6663,7 +6663,7 @@
 for dir in $kde_qt_dirs; do
    qt_incdirs="$qt_incdirs $dir/include $dir"
 done
-qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 $x_includes"
+qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include/qt3 /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 $x_includes"
 if test ! "$ac_qt_includes" = "NO"; then
    qt_incdirs="$ac_qt_includes $qt_incdirs"
 fi
diff -ru skolelinux-orig/src/kschoolmenu/debian/rules skolelinux/src/kschoolmenu/debian/rules
--- skolelinux-orig/src/kschoolmenu/debian/rules	2003-04-24 04:38:38.000000000 +0200
+++ skolelinux/src/kschoolmenu/debian/rules	2003-07-17 17:18:17.000000000 +0200
@@ -33,6 +33,7 @@
 	dh_testdir
 
 	# Add here commands to compile the package.
+	moc kschoolmenu/kschoolmenu.h -o kschoolmenu/kschoolmenu.moc
 	$(MAKE)
 	#/usr/bin/docbook-to-man debian/kschoolmenu.sgml > kschoolmenu.1
 
@@ -45,6 +46,7 @@
 
 	# Add here commands to clean up after the build process.
 	-$(MAKE) distclean
+	-rm kschoolmenu/kschoolmenu.moc
 	-test -r /usr/share/misc/config.sub && \
 	  cp -f /usr/share/misc/config.sub config.sub
 	-test -r /usr/share/misc/config.guess && \
diff -ru skolelinux-orig/src/kschoolmenu/kschoolmenu/kschoolmenu.cpp skolelinux/src/kschoolmenu/kschoolmenu/kschoolmenu.cpp
--- skolelinux-orig/src/kschoolmenu/kschoolmenu/kschoolmenu.cpp	2003-04-29 21:29:49.000000000 +0200
+++ skolelinux/src/kschoolmenu/kschoolmenu/kschoolmenu.cpp	2003-07-24 20:33:53.000000000 +0200
@@ -41,7 +41,6 @@
 
 #include <iostream>
 
-
 MenuItem::MenuItem(const QPixmap& icon, const QString& name, const QString& path)
   : icon(icon),
     name(name),
@@ -56,7 +55,6 @@
     if(file.open(IO_ReadOnly))
     {
       desktopFile = QTextStream(&file).read();
-
       file.close();
     }
   }
@@ -70,7 +68,7 @@
 
 void MenuItem::Show()
 {
-  cout << "Debug: menuitem::Show: " << name << "\n";
+  hidden = false;
 }
 
 void MenuItem::Hide()
@@ -87,34 +85,23 @@
 
 static void read_desktop_files(MenuItem* item, const QString& path)
 {
-
   if(item->path.contains(".desktop"))
-  {
-    QFile file(path + item->path.right(item->path.length() - item->path.findRev('/')));
-
-    if(file.open(IO_ReadOnly))
-    {
-      QTextStream stream(&file);
-      file.close();
+  { 
+    KDesktopFile desktopFile(path + item->path.right(item->path.length() - item->path.findRev('/')));
+    // check if we should really hide the item
+    if(desktopFile.readBoolEntry("NoDisplay") || desktopFile.readBoolEntry("Hidden"))
       item->Hide();
-      cout << "Debug: read_desktop_files: hide: " << file.name() << "\n" ;
-      
-    }
   }
   else
   {
-    QFile file(path + '/' + item->path.right(item->path.length() - item->path.findRev('/')) + "/.directory");
-
-    if(file.open(IO_ReadOnly))
-    {
-      QTextStream stream(&file);
-      file.close();
+    KDesktopFile desktopFile(path + item->path.right(item->path.length() - item->path.findRev('/')) + "/.directory");
+    // check if we should really hide the item
+    if(desktopFile.readBoolEntry("NoDisplay") || desktopFile.readBoolEntry("Hidden"))
       item->Hide();
-      cout << "Debug: read_desktop_files: hide: " << file.name() << "\n" ;
-    }
-
+    
+    // call read_desktop_files() for all files and subdirectories in path
     for(uint i = 0; i < item->children.size(); ++i) 
-      read_desktop_files(item->children[i], path + '/' + item->path.right(item->path.length() - item->path.findRev('/'))); 
+      read_desktop_files(item->children[i], path + item->path.right(item->path.length() - item->path.findRev('/'))); 
   }
 }
 
@@ -135,14 +122,19 @@
     if(info.isDir())
     {
       KDesktopFile desktopFile(info.filePath() + "/.directory");
+      QString itemName;
 
       if(desktopFile.readBoolEntry("NoDisplay") || desktopFile.readBoolEntry("Hidden"))
         continue;
 
+      itemName = desktopFile.readName();
+      if (!itemName)
+        itemName = dir[i];
+      
       MenuItem* item = new MenuItem(
         KGlobal::iconLoader()->loadIcon(desktopFile.readIcon(), KIcon::Desktop, KIcon::SizeSmall),
-        desktopFile.readName(),
-        info.filePath().right(info.filePath().length() - path.length() - 1));
+        itemName,
+        info.filePath());
 
       QFile file(info.filePath() + "/.directory");
 
@@ -160,14 +152,18 @@
     else
     {
       KDesktopFile desktopFile(info.filePath());
+      QString itemName;
 
       if(desktopFile.readBoolEntry("NoDisplay") || desktopFile.readBoolEntry("Hidden"))
         continue;
 
+      itemName = desktopFile.readName();
+      if (!itemName)
+        itemName = dir[i];
+ 
       MenuItem* item = new MenuItem(
         KGlobal::iconLoader()->loadIcon(desktopFile.readIcon(), KIcon::Desktop, KIcon::SizeSmall),
-        desktopFile.readName(),
-        info.filePath());
+        itemName, info.filePath());
 
       push_back(parent.children, item);
     }
@@ -243,21 +239,27 @@
 }
 
 template<class type>
-static void add_children(const MenuItem& parentItem, type* parentWidget)
+static void add_children(const MenuItem& parentItem, type* parentWidget, const QString &open, const QString &select)
 {
   for(uint i = 0; i < parentItem.children.size(); ++i)
   {
     if (! parentItem.children[i]->Hidden())
     {
-			QListViewItem* item = new QListViewItem(parentWidget, parentItem.children[i]->name, parentItem.children[i]->path);
+      QListViewItem* item = new QListViewItem(parentWidget, parentItem.children[i]->name, parentItem.children[i]->path);
 
-			item->setPixmap(0, parentItem.children[i]->icon);
+      item->setPixmap(0, parentItem.children[i]->icon);
 
-			if(!parentItem.children[i]->path.contains(".desktop"))
-				item->setExpandable(true);
+      if(!parentItem.children[i]->path.contains(".desktop"))
+      {
+        item->setExpandable(true);
+	if (open.contains(parentItem.children[i]->path))
+	  item->setOpen(true);
+      }
+      if (select == parentItem.children[i]->path)
+        item->setSelected(true);
 
-			add_children(*parentItem.children[i], item);
-		}
+      add_children(*parentItem.children[i], item, open, select);
+    }
   }
 }
 
@@ -277,16 +279,17 @@
   dir.setSorting(QDir::Name);
   dir.setMatchAllDirs(true);
 
+  // for every directory in /var/lib/kschoolmenu/
   for(uint i = 0; i < dir.count(); ++i)
   {
     if(dir[i] == "." || dir[i] == "..")
       continue;
 
-    
     MenuItem* item = new MenuItem(QPixmap(), dir[i], QString("/var/lib/kschoolmenu/") + dir[i] + "/share/applnk");
 
+    // read the files for the QListViews
     read_dir ("/usr/share/applnk", *item);
-
+    // hide the files for the listCurrentMenu QListView
     read_desktop_files(item, "/var/lib/kschoolmenu/" + dir[i] + "/share") ;
 
     push_back(customMenus, item);
@@ -299,7 +302,7 @@
   listCurrentMenu->header()->hide();
   listCurrentMenu->setRootIsDecorated(true);
 
-  add_children(availableItems, listAvailableItems);
+  add_children(availableItems, listAvailableItems, NULL, NULL);
 
   comboCustomMenusActivated(comboCustomMenus->currentItem());
 }
@@ -357,43 +360,45 @@
 {
   if(item->path.contains(".desktop"))
   {
-    if (!item->Hidden())
-      return;
-
-    item->desktopFile = "[Desktop Entry]\nHidden=true\nName=empty";
-
     QFile file(path + item->path.right(item->path.length() - item->path.findRev('/')));
-
-    if(file.open(IO_WriteOnly))
+    if (item->Hidden())
     {
-      QTextStream stream(&file);
-
-      stream << item->desktopFile;
+      item->desktopFile = "[Desktop Entry]\nHidden=true\nName=empty";
 
-      file.close();
+      if(file.open(IO_WriteOnly))
+      {
+        QTextStream stream(&file);
+        stream << item->desktopFile;
+        file.close();
+      }
     }
+    else
+      file.remove(); 
   }
   else
   {
+    QFile file(path + item->path.right(item->path.length() - item->path.findRev('/')) + "/.directory");
     if (find_hidden(item))
-      QDir().mkdir(path + "/" + item->path);
+      QDir().mkdir(path + item->path.right(item->path.length() - item->path.findRev('/')));
     if(item->Hidden())
     {
-      QFile file(path + "/" + item->path + "/.directory");
       item->desktopFile = "[Desktop Entry]\nHidden=true\nName=empty";
 
       if(file.open(IO_WriteOnly))
       {
         QTextStream stream(&file);
-
         stream << item->desktopFile;
-
         file.close();
       }
     }
+    else
+      file.remove(); 
 
-    for(uint i = 0; i < item->children.size(); ++i) 
-      write_desktop_files(item->children[i], path + "/" + item->path);
+    for(uint i = 0; i < item->children.size(); ++i)
+      if (path == "")
+        write_desktop_files(item->children[i], path + item->path);
+      else
+        write_desktop_files(item->children[i], path + '/' + item->path.right(item->path.length() - item->path.findRev('/') - 1));
   }
 }
 
@@ -519,14 +524,29 @@
   emit changed(true);
 }
 
-MenuItem* find_item(MenuItem* menu, const QString& path)
+MenuItem* find_item(MenuItem* menu, const QString& path, const QString& name)
 {
-  if(menu->name == path)
-    return menu;
+  if(menu->path.left(menu->path.findRev('/')) == path)
+  {
+    if(menu->path.contains(".desktop"))
+    { 
+      KDesktopFile desktopFile(menu->path);
+
+      if(desktopFile.readName() == name)
+        return menu;
+    }
+    else
+    {
+      KDesktopFile desktopFile(menu->path + "/.directory");
+
+      if(desktopFile.readName() == name || menu->path.right(menu->path.length() - menu->path.findRev('/') - 1) == name)
+        return menu;
+    } 
+  }
 
   for(uint i = 0; i < menu->children.size(); ++i)
   {
-    MenuItem* ret = find_item(menu->children[i], path);
+    MenuItem* ret = find_item(menu->children[i], path, name);
 
     if(ret)
       return ret;
@@ -549,30 +569,29 @@
       break;
     }
 
-  QListViewItem* newItemParent = listCurrentMenu->currentItem();
-
-  if(newItemParent && !newItemParent->isExpandable())
-    newItemParent = newItemParent->parent();
-
-  QListViewItem* newItem;
-  
-  if(!newItemParent)
+  MenuItem *tmpItem = find_item(menu, item->text(1).left(item->text(1).findRev('/')), item->text(0));
+  QString open = item->text(1);
+  QString select = open;
+  if (tmpItem->Hidden())
   {
-    newItem = new QListViewItem(listCurrentMenu, item->text(0), item->text(1));
-    push_back(menu->children, new MenuItem(*item->pixmap(0), item->text(0), item->text(1)));
+    tmpItem->Show();
+    listCurrentMenu->clear();
+    add_children(*menu, listCurrentMenu, open, select);
   }
-  else
-  {
-    newItem = new QListViewItem(newItemParent, item->text(0), item->text(1));
 
-    if(!newItemParent->isOpen())
-      newItemParent->setOpen(true);
-
-    push_back(find_item(menu, newItemParent->text(1))->children, new MenuItem(*item->pixmap(0), item->text(0), item->text(1)));
+  while (item->parent())
+  {
+    item = item->parent(); 
+    open += item->text(1);
+    MenuItem *tmpItem = find_item(menu, item->text(1).left(item->text(1).findRev('/')), item->text(0));
+    if (tmpItem->Hidden())
+    {
+      tmpItem->Show();
+      listCurrentMenu->clear();
+      add_children(*menu, listCurrentMenu, open, select);
+    }
   }
-
-  newItem->setPixmap(0, *item->pixmap(0));
-
+  
   emit changed(true);
 }
 
@@ -591,14 +610,19 @@
       break;
     }
 
-
   // search to find top List-handle 
   QListViewItem* topFound = toHide ;
-  while (topFound->parent()) topFound = topFound->parent() ;
-
+  QString path = "/usr/share/applnk"; 
+ 
+  while (topFound->parent()) 
+    topFound = topFound->parent() ;
+  
+  if (toHide->parent())
+    path = toHide->parent()->text(1);
+  
   while (topFound != toHide)
   {
-    item = find_item (item, topFound->text(0));
+    item = find_item (item, path, toHide->text(0));
     QListViewItem* listTraverse = toHide ; 
     while (listTraverse->parent() != topFound)
       listTraverse = listTraverse->parent();
@@ -607,9 +631,8 @@
 
   if (topFound == toHide)
   {
-    item = find_item (item, topFound->text(0));
+    item = find_item (item, path, toHide->text(0));
     item->Hide() ; 
-  
     delete listCurrentMenu->currentItem();
 
     if(listCurrentMenu->currentItem())
@@ -630,10 +653,6 @@
   }
 
   // if(!listAvailableItems->currentItem()->isExpandable() && buttonRemove->isEnabled())
-
-/*
-  // Adding elements to the menu is disabled for now (only removal)
-  
   if(buttonRemove->isEnabled())
   {
     buttonRight->setEnabled(true);
@@ -642,7 +661,6 @@
   {
     buttonRight->setEnabled(false);
   }
-*/
 }
 
 void KSchoolmenu::listCurrentMenuSelectionChanged()
@@ -676,7 +694,7 @@
     {
       if(customMenus[i]->name == comboCustomMenus->currentText())
       {
-        add_children(*customMenus[i], listCurrentMenu);
+        add_children(*customMenus[i], listCurrentMenu, NULL, NULL);
 
         break;
       }