void PanelBrowserMenu::initialize() { _lastpress = QPoint(-1, -1); // don't change menu if already visible if (isVisible()) return; if (_dirty) { // directory content changed while menu was visible slotClear(); setInitialized(false); _dirty = false; } if (initialized()) return; setInitialized(true); // start watching if not already done if (!_dirWatch.contains(path())) _dirWatch.addDir( path() ); // setup icon map initIconMap(); // clear maps _filemap.clear(); _mimemap.clear(); QDir::Filters filter = QDir::Dirs | QDir::Files; if (KickerSettings::showHiddenFiles()) { filter |= QDir::Hidden; } QDir dir(path(), QString(), QDir::DirsFirst | QDir::Name | QDir::IgnoreCase, filter); // does the directory exist? if (!dir.exists()) { insertItem(i18n("Failed to Read Folder")); return; } // get entry list QFileInfoList list = dir.entryInfoList(); KUrl url; url.setPath(path()); if (!KAuthorized::authorizeUrlAction("list", KUrl(), url)) { insertItem(i18n("Not Authorized to Read Folder")); return; } // insert file manager and terminal entries // only the first part menu got them if(_startid == 0 && !_filesOnly) { // FIXME: no more menu titles so NOW WHAT?! // insertTitle(path()); insertItem(CICON("kfm"), i18n("Open in File Manager"), this, SLOT(slotOpenFileManager())); if (KAuthorized::authorizeKAction("shell_access")) insertItem(CICON("terminal"), i18n("Open in Terminal"), this, SLOT(slotOpenTerminal())); } bool first_entry = true; bool dirfile_separator = false; unsigned int item_count = 0; int run_id = _startid; // get list iterator QFileInfoList::iterator it = list.begin(); // jump to startid it += _startid; // iterate over entry list for (; it != list.end(); ++it) { // bump id run_id++; QFileInfo fi = *it; // handle directories if (fi.isDir()) { QString name = fi.fileName(); // ignore . and .. entries if (name == "." || name == "..") continue; QPixmap icon; QString path = fi.absoluteFilePath(); // parse .directory if it does exist if (QFile::exists(path + "/.directory")) { KDesktopFile c(path + "/.directory"); const KConfigGroup cg = c.desktopGroup(); QString iconPath = cg.readEntry("Icon"); if ( iconPath.startsWith("./") ) iconPath = path + '/' + iconPath.mid(2); icon = KIconLoader::global()->loadIcon(iconPath, KIconLoader::Small, KIconLoader::SizeSmall, KIconLoader::DefaultState, QStringList(), 0, true); if(icon.isNull()) icon = CICON("folder"); name = cg.readEntry("Name", name); } // use cached folder icon for directories without special icon if (icon.isNull()) icon = CICON("folder"); // insert separator if we are the first menu entry if(first_entry) { if (_startid == 0 && !_filesOnly) addSeparator(); first_entry = false; } // append menu entry PanelBrowserMenu *submenu = new PanelBrowserMenu(path, this); submenu->_filesOnly = _filesOnly; append(icon, name, submenu); // bump item count item_count++; dirfile_separator = true; } // handle files else if(fi.isFile()) { QString name = fi.fileName(); QString title = KIO::decodeFileName(name); QPixmap icon; QString path = fi.absoluteFilePath(); bool mimecheck = false; // .desktop files if(KDesktopFile::isDesktopFile(path)) { KDesktopFile c( path ); const KConfigGroup cg = c.desktopGroup(); title = cg.readEntry("Name", title); QString s = cg.readEntry("Icon"); if(!_icons->contains(s)) { icon = KIconLoader::global()->loadIcon(s, KIconLoader::Small, KIconLoader::SizeSmall, KIconLoader::DefaultState, QStringList(), 0, true); if(icon.isNull()) { QString type = cg.readEntry("Type", "Application"); if (type == "Directory") icon = CICON("folder"); else if (type == "Mimetype") icon = CICON("txt"); else if (type == "FSDevice") icon = CICON("chardevice"); else icon = CICON("exec"); } else _icons->insert(s, icon); } else icon = CICON(s); } else { // set unknown icon icon = CICON("unknown"); // mark for delayed mimetime check mimecheck = true; } // insert separator if we are the first menu entry if(first_entry) { if(_startid == 0 && !_filesOnly) addSeparator(); first_entry = false; } // insert separator if we we first file after at least one directory if (dirfile_separator) { addSeparator(); dirfile_separator = false; } // append file entry append(icon, title, name, mimecheck); // bump item count item_count++; } if (item_count == KickerSettings::maxEntries2()) { // Only insert a "More" item if there are actually more items. ++it; if( it != list.end() ) { addSeparator(); append(CICON("kdisknav"), i18n("More"), new PanelBrowserMenu(path(), this, run_id)); } break; } } #if 0 // WABA: tear off handles don't work together with dynamically updated // menus. We can't update the menu while torn off, and we don't know // when it is torn off. if(KGlobalSettings::insertTearOffHandle() && item_count > 0) insertTearOffHandle(); #endif adjustSize(); QString dirname = path(); int maxlen = contentsRect().width() - 40; if(item_count == 0) maxlen = fontMetrics().width(dirname); if (fontMetrics().width(dirname) > maxlen) { while ((!dirname.isEmpty()) && (fontMetrics().width(dirname) > (maxlen - fontMetrics().width("...")))) dirname = dirname.remove(0, 1); dirname.prepend("..."); } setWindowTitle(dirname); // setup and start delayed mimetype check timer if(_mimemap.count() > 0) { if(!_mimecheckTimer) _mimecheckTimer = new QTimer(this); connect(_mimecheckTimer, SIGNAL(timeout()), SLOT(slotMimeCheck())); _mimecheckTimer->start(0); } }
void PanelKMenu::initialize() { // kDebug(1210) << "PanelKMenu::initialize()"; updateRecent(); if (initialized()) { return; } if (loadSidePixmap()) { // in case we've been through here before, let's disconnect disconnect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()), this, SLOT(paletteChanged())); connect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()), this, SLOT(paletteChanged())); } else { sidePixmap = sideTilePixmap = QPixmap(); } // add services PanelServiceMenu::initialize(); /* FIXME: no more insertTitle! now what? if (KickerSettings::showMenuTitles()) { int id; id = insertTitle(i18n("All Applications"), -1, 0); setItemEnabled( id, false ); id = insertTitle(i18n("Actions"), -1 , -1); setItemEnabled( id, false ); } */ // create recent menu section createRecentMenuItems(); bool need_separator = false; // insert bookmarks if (KickerSettings::useBookmarks() && KAuthorized::authorizeKAction("bookmarks")) { // Need to create a new popup each time, it's deleted by subMenus.clear() KMenu * bookmarkParent = new KMenu(this); bookmarkParent->setObjectName("bookmarks" ); delete bookmarkMenu; // can't reuse old one, the popup has been deleted bookmarkMenu = new KBookmarkMenu( KBookmarkManager::userBookmarksManager(), 0, bookmarkParent, actionCollection ); insertItem(Plasma::menuIconSet("bookmark"), i18n("Bookmarks"), bookmarkParent); subMenus.append(bookmarkParent); need_separator = true; } // insert quickbrowser if (KickerSettings::useBrowser()) { PanelQuickBrowser *browserMnu = new PanelQuickBrowser(this); browserMnu->initialize(); insertItem(Plasma::menuIconSet("kdisknav"), i18n("Quick Browser"), Plasma::reduceMenu(browserMnu)); subMenus.append(browserMnu); need_separator = true; } // insert dynamic menus QStringList menu_ext = KickerSettings::menuExtensions(); if (!menu_ext.isEmpty()) { for (QStringList::ConstIterator it=menu_ext.begin(); it!=menu_ext.end(); ++it) { MenuInfo info(*it); if (!info.isValid()) continue; KPanelMenu *menu = info.load(); if (menu) { insertItem(Plasma::menuIconSet(info.icon()), info.name(), menu); dynamicSubMenus.append(menu); need_separator = true; } } } if (need_separator) addSeparator(); // run command if (KAuthorized::authorizeKAction("run_command")) { insertItem(Plasma::menuIconSet("system-run"), i18n("Run Command..."), this, SLOT( slotRunCommand())); addSeparator(); } if (KDisplayManager().isSwitchable() && KAuthorized::authorizeKAction("switch_user")) { sessionsMenu = new QMenu( this ); insertItem(Plasma::menuIconSet("switchuser"), i18n("Switch User"), sessionsMenu); connect( sessionsMenu, SIGNAL(aboutToShow()), SLOT(slotPopulateSessions()) ); connect( sessionsMenu, SIGNAL(activated(int)), SLOT(slotSessionActivated(int)) ); } /* If the user configured ksmserver to */ KConfig ksmserver("ksmserverrc", KConfig::CascadeConfig); if (ksmserver.group("General").readEntry( "loginMode" ) == "restoreSavedSession") { insertItem(Plasma::menuIconSet("document-save"), i18n("Save Session"), this, SLOT(slotSaveSession())); } if (KAuthorized::authorizeKAction("lock_screen")) { insertItem(Plasma::menuIconSet("system-lock-screen"), i18n("Lock Session"), this, SLOT(slotLock())); } if (KAuthorized::authorizeKAction("logout")) { insertItem(Plasma::menuIconSet("application-exit"), i18n("Log Out..."), this, SLOT(slotLogout())); } #if 0 // WABA: tear off handles don't work together with dynamically updated // menus. We can't update the menu while torn off, and we don't know // when it is torn off. if (KGlobalSettings::insertTearOffHandle()) insertTearOffHandle(); #endif setInitialized(true); }
void PanelKMenu::initialize() { // kdDebug(1210) << "PanelKMenu::initialize()" << endl; updateRecent(); if (initialized()) { return; } if (loadSidePixmap()) { // in case we've been through here before, let's disconnect disconnect(kapp, SIGNAL(kdisplayPaletteChanged()), this, SLOT(paletteChanged())); connect(kapp, SIGNAL(kdisplayPaletteChanged()), this, SLOT(paletteChanged())); } else { sidePixmap = sideTilePixmap = QPixmap(); } // add services PanelServiceMenu::initialize(); if (KickerSettings::showMenuTitles()) { int id; id = insertItem(new PopupMenuTitle(i18n("All Applications"), font()), -1 /* id */, 0); setItemEnabled( id, false ); id = insertItem(new PopupMenuTitle(i18n("Actions"), font()), -1 /* id */, -1); setItemEnabled( id, false ); } // create recent menu section createRecentMenuItems(); bool need_separator = false; // insert bookmarks if (KickerSettings::useBookmarks() && kapp->authorizeKAction("bookmarks")) { // Need to create a new popup each time, it's deleted by subMenus.clear() KPopupMenu * bookmarkParent = new KPopupMenu( this, "bookmarks" ); if(!bookmarkOwner) bookmarkOwner = new KBookmarkOwner; delete bookmarkMenu; // can't reuse old one, the popup has been deleted bookmarkMenu = new KBookmarkMenu( KonqBookmarkManager::self(), bookmarkOwner, bookmarkParent, actionCollection, true, false ); insertItem(KickerLib::menuIconSet("bookmark"), i18n("Bookmarks"), bookmarkParent); subMenus.append(bookmarkParent); need_separator = true; } // insert quickbrowser if (KickerSettings::useBrowser()) { PanelQuickBrowser *browserMnu = new PanelQuickBrowser(this); browserMnu->initialize(); insertItem(KickerLib::menuIconSet("kdisknav"), i18n("Quick Browser"), KickerLib::reduceMenu(browserMnu)); subMenus.append(browserMnu); need_separator = true; } // insert dynamic menus QStringList menu_ext = KickerSettings::menuExtensions(); if (!menu_ext.isEmpty()) { for (QStringList::ConstIterator it=menu_ext.begin(); it!=menu_ext.end(); ++it) { MenuInfo info(*it); if (!info.isValid()) continue; KPanelMenu *menu = info.load(); if (menu) { insertItem(KickerLib::menuIconSet(info.icon()), info.name(), menu); dynamicSubMenus.append(menu); need_separator = true; } } } if (need_separator) insertSeparator(); // insert client menus, if any if (clients.count() > 0) { QIntDictIterator<KickerClientMenu> it(clients); while (it){ if (it.current()->text.at(0) != '.') insertItem( it.current()->icon, it.current()->text, it.current(), it.currentKey() ); ++it; } insertSeparator(); } // run command if (kapp->authorize("run_command")) { insertItem(KickerLib::menuIconSet("run"), i18n("Run Command..."), this, SLOT( slotRunCommand())); insertSeparator(); } if (DM().isSwitchable() && kapp->authorize("switch_user")) { sessionsMenu = new QPopupMenu( this ); insertItem(KickerLib::menuIconSet("switchuser"), i18n("Switch User"), sessionsMenu); connect( sessionsMenu, SIGNAL(aboutToShow()), SLOT(slotPopulateSessions()) ); connect( sessionsMenu, SIGNAL(activated(int)), SLOT(slotSessionActivated(int)) ); } /* If the user configured ksmserver to */ KConfig ksmserver("ksmserverrc", false, false); ksmserver.setGroup("General"); if (ksmserver.readEntry( "loginMode" ) == "restoreSavedSession") { insertItem(KickerLib::menuIconSet("filesave"), i18n("Save Session"), this, SLOT(slotSaveSession())); } if (kapp->authorize("lock_screen")) { insertItem(KickerLib::menuIconSet("lock"), i18n("Lock Session"), this, SLOT(slotLock())); } if (kapp->authorize("logout")) { insertItem(KickerLib::menuIconSet("exit"), i18n("Log Out..."), this, SLOT(slotLogout())); } #if 0 // WABA: tear off handles don't work together with dynamically updated // menus. We can't update the menu while torn off, and we don't know // when it is torn off. if (KGlobalSettings::insertTearOffHandle()) insertTearOffHandle(); #endif setInitialized(true); }