> On Sept. 28, 2014, 3:13 nachm., Thomas Lübking wrote:
> > kdeui/widgets/kmenu.cpp, line 182
> > <https://git.reviewboard.kde.org/r/120403/diff/1/?file=315609#file315609line182>
> >
> >     try to avoid negated bools unless for performance or readability 
> > reasons (ie. you'd need "!flag" a lot otherwise)
> 
> René J.V. Bertin wrote:
>     isNOSXMenuBar? ;)

reverse logics.
"isMacMenuBar = false;"


> On Sept. 28, 2014, 3:13 nachm., Thomas Lübking wrote:
> > kdeui/widgets/kmenu.cpp, line 189
> > <https://git.reviewboard.kde.org/r/120403/diff/1/?file=315609#file315609line189>
> >
> >     As mentioned before, the parentship is pretty meaningless here. A popup 
> > *might* be parented by a window that has it in its menubar, but doesn't 
> > have to at all.
> 
> René J.V. Bertin wrote:
>     Not necessarily at "this moment", but I've only seen menubars attached to 
> windows until now ...

Menubars, yes. QMenus, no.


> On Sept. 28, 2014, 3:13 nachm., Thomas Lübking wrote:
> > kdeui/widgets/kmenu.cpp, line 191
> > <https://git.reviewboard.kde.org/r/120403/diff/1/?file=315609#file315609line191>
> >
> >     If I understand the Qt doc correctly, there're basically two kinds of 
> > menubars:
> >     1) per window
> >     2) shared
> >     
> >     however, they all will end up as global menu?
> >     
> >     Even if not:
> >     how many menubars are not mapped to the global one (the I could think 
> > of Qt Designer forms) and are those false positives actually worth the 
> > false negatives (ie. you miss special casing a menu)?
> 
> René J.V. Bertin wrote:
>     For the moment we're talking KDE, not (pure) Qt apps. The only KDE app I 
> know that uses per-window menus even on OS X is konsole. And it doesn't use 
> KMenu::addTitle.
>     
>     What's your point? That in the end I might be better off just emulating 
> the title rendering for all popup menus, even if they actually could render 
> the "official" style?

> just emulating the title rendering for all popup menus, even if they actually 
> could render the "official" style?

That. Yes.


> On Sept. 28, 2014, 3:13 nachm., Thomas Lübking wrote:
> > kdeui/widgets/kmenu.cpp, line 186
> > <https://git.reviewboard.kde.org/r/120403/diff/1/?file=315609#file315609line186>
> >
> >     parsing associatedWidgets (eg. a QMenu or a QMenuBar or a QToolButton) 
> > is a good idea, but what you want to do is to search yourself through pot. 
> > QMenu's until one ::menuAction() is associated to a QMenuBar (ie. "this 
> > menu can be reached by navigating through a menubar and its menus)
> 
> René J.V. Bertin wrote:
>     I think you've lost me a bit here. Not to appear dumb or lazy, but how 
> does one do that? Are we looking at a recursive function that gets called for 
> each QMenu encountered (starting with 'this', calling itself afterwards) and 
> cycles through all that QMenu's ::menuAction()->associatedWidgets, until we 
> hit a widget for which `qobject_cast<QMenuBar*>(w) != NULL`?
>     (Or is there a better way to check the type of a QWidget?)
>     
>     
>     (AAArrgggh, all this would be much simpler if KDevelop would stop 
> exitting for no apparent reason and without any error message like it just 
> did, again)

```cpp
static bool isMenubarMenu(QMenu *m) {
   if (!m) return false;
   if (!m->menuAction()) return false;
   foreach (QWidget *w, m->menuAction()->associatedWidgets()) {
      if (qobject_cast<QMenuBar*>(w))
         return true;
      if (isMenubarMenu(qobject_cast<QMenu*>(w)))
         return true;
   }
   return false;
}
```

depending on how silly client codes are, one might have to catch in/direct 
recursions:
```cpp
if (w == m) return false; // direct recursion, menu is submenu of itself
if (seenWidgets.contains(w))
   continue; // indirect recursion, menu is sub-submenu of itself
seenWidgets << w;
```

please notice that the above has sketch-quality only (browsers make crap code 
editors ;-)


- Thomas


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://git.reviewboard.kde.org/r/120403/#review67559
-----------------------------------------------------------


On Sept. 28, 2014, 12:46 nachm., René J.V. Bertin wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://git.reviewboard.kde.org/r/120403/
> -----------------------------------------------------------
> 
> (Updated Sept. 28, 2014, 12:46 nachm.)
> 
> 
> Review request for KDE Software on Mac OS X, kdelibs and Qt KDE.
> 
> 
> Repository: kdelibs
> 
> 
> Description
> -------
> 
> This is a spin-off of RR https://git.reviewboard.kde.org/r/120355/
> 
> As described in that RR, OS X cannot render menu items that were created 
> using `KMenu::addTitle`. Without a Qt patch, that function will even provoke 
> a crash. With a patch, the items are rendered barely legibly once, and then 
> render as empty space in subsequent menu openings.
> The main object of that RR is to present and discuss a workaround at the 
> client level, emulating `KMenu::addTitle`. In this RR, I present a draft 
> adaptation of that function itself.
> 
> The main goal as I see it is to modify the function just enough so that it 
> changes its behaviour for items that will or can be rendered in the Mac's 
> global menubar, using non-Qt code. Pop-up menus that are not attached to that 
> structure are rendered through Qt and can show all the style formatting they 
> can under Linux as long as it's not tied to X11 directly.
> It's probably impossible to cater to all possible use cases, so I'd propose 
> to focus on the situations we can detect from inside `KMenu::addTitle`. That 
> is, *if* we want to ease the client's burden of obtaining a sensible menu 
> item *and* we want to maintain support for the intended/expected style in the 
> menus that can actually support them. (KDevelop's context menu its Project 
> view is a prime example.)
> The other goal (secondary for KDE/Mac for the time being) is to come up with 
> a patch proposal for Qt5's `QMenu::addSection`, because its current use of 
> texted separators makes it equivalent to `QMenu::addSeparator` on OS X. (= 
> you get a separator instead of an item showing the title text.)
> 
> I have not found a way to detect reliably that a menu is attached to the 
> global menubar. There are functions that are supposed to allow this 
> (KMenu::isTopLevelMenu, QMenu::macMenu) but they don't work as expected. So 
> what I propose here is to emulate the styled menu title when adding to a 
> KMenu that is somehow associated to a KMenu belonging to a KMainWindow that 
> has a menubar. This can probably lead to false hits, and I have already 
> learned that it doesn't catch all the intended cases either (e.g. 
> MessageList->Sorting menu under KMail's View menu is apparently not yet 
> attached when addTitle is called). So I'm following Thomas's suggestion to 
> publish the draft for feedback.
> 
> In case anyone wonders about the emulation code (when notMacMenuBar==false): 
> I'm open for suggestions but this is the only approach I've found to create 
> an entry that stands out. It's not impossible to to obtain the font OS X uses 
> for menubar menu items (Lucida Grande 14; requires 2 extra functions), but 
> changing font attributes (bold, underline, overline etc) has no effect. (The 
> bold font version file is available, so it might be possible to get the bold 
> font rendered by specifying it as a full font spec and not as an attribute 
> but I wouldn't know how to achieve this.)
> 
> 
> Diffs
> -----
> 
>   kdeui/widgets/kmenu.cpp 7dab149 
> 
> Diff: https://git.reviewboard.kde.org/r/120403/diff/
> 
> 
> Testing
> -------
> 
> On OS X 10.6.8 with kdelibs git/kde4.14 . Currently the draft does nothing on 
> other OSes, and the actual "emulation" code (when notMacMenuBar==false) can 
> go conditional if there are no other platforms where a similar approach could 
> be desired.
> 
> 
> Thanks,
> 
> René J.V. Bertin
> 
>

Reply via email to