-
-
Notifications
You must be signed in to change notification settings - Fork 190
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Menu #89
Comments
See https://gitlab.com/TheOneWithTheBraid/contextmenu/-/tree/main/lib/src for how to make this. Demo here https://theonewiththebraid.gitlab.io/contextmenu/#/ |
Hey I'd like to try to implement this feature if help is still needed :) However, duo to university stuff I can not promise keeping a deadline 😄 |
Absolutely, please go for it! |
Is there a good exemplary application from which I should copy the macos design and feel? I am kinda new to macos thus I don't really know where to find certain elements :) Thank you! |
@kiesman99 I know its difficult for you to get a sense of your timeline because of school, but do you think you have a rough idea of when you think you can deliver this? Just so we know when to look out for it? |
@GroovinChip I'm playing a little with the api today to get a feel for it. I will respond after I've checked it out :) |
Sounds great, thank you! |
Hey @GroovinChip quick question: The snippet you provided uses showModal which is a function coming from the animations package. Is it okay to depend on this library or should I try to implement this feature using OverlayEntry or Remi Rousselet's flutter_portal (currently unmaintained)? |
I'd say let's try our own implementation, the less we depend on outside libraries the better. |
Looks like this is actually a duplicate of #53 but I'll keep this open since more movement is happening here |
Hey I've wanted to give a quick summary on what I've done today. I've played around with the OverlayEntry and accomplished a rather basic Version of the contextmenu as you can see here: Currently, I get an exception if remove the Overlay on exiting the region this has to be investigated. Also, I don't know if we should proceed or wait with this issue as the context menu cannot be drawn outside of the flutter application with this approach. Whereas in Macos the context menu should display above the flutter application: I'd imagine such an implementation would require looking into the Flutter Macos Embedder. Doing a (very) quick research i could not find a method to implement this behavior, but as canonical is choosing flutter as the main framework to write desktop applications maybe they'll implement such a feature in the future. |
Regarding the 'deadline': I will try to implement this feature in the upcoming two weeks I think. |
Wow @kiesman99 this is amazing work, thank you! Maybe we can ask around the Flutter community for some ideas. I'd say you should keep going, this is really great! |
I tweeted this issue out here |
Thanks @GroovinChip! I've created a WIP PR #125. I am very excited if we could accomplish to place the context menu outside the flutter application. I'll keep an eye on that tweet :) |
See flutter/flutter#30701 for more info on this |
@kiesman99 While you can't render anything outside of the window (for security reasons), you can add something like a "padding" to make it fit the window. When implementing tooltip, I found a method on the framework that does exactly that. It tries to position the child on the required offset, but if not possible, it handles that for you. https://github.com/GroovinChip/macos_ui/blob/dev/lib/src/labels/tooltip.dart#L578
|
@bdlukaa i will look into this :) My plan is to move the context menu to the left side if the user clicks somewhere near the right border but that wouldn't solve the issue of too small windows. I think this is especially crucial, because context menus are limited in height and therefore in the number of elements. Also this is a red light to distinguish a flutter Mac_OS app from a native MacOS application. |
We can do a few things to solve this:
|
I think for now I'll go with the Yesterday I've implemented a basic version of a How do we want to design the api? Do you want to provide a Widget in which the build(context) {
return ContextMenuArea(
menu: ContextMenu(
children: [
ContextMenuTile(),
ContextMenuTile(),
ContextMenuDivider(),
ContextMenuTile(
subMenu: ContextMenu(
children: [
// some more items for the submenu
]
)
)
]
)
child: Child() // inside of this child the user is able to invoke the context menu
);
} The Or do we want to provide an imperative approach similar to showDialog? void _contextMenu(TapDownDetails details) {
// actual call to open context menu
showContextMenu(
position: details.globalPosition,
builder: (context) {
// build context menu in build function
return ContextMenu(
children: [
ContextMenuTile(),
ContextMenuTile(),
ContextMenuDivider(),
ContextMenuTile(
subMenu: ContextMenu(
children: [
// some more items for the submenu
]
)
)
]
);
}
);
}
build(context) {
return GestureDetector(
onSecondaryTapDown: (details) => _contextMenu(details)
child: Child()
);
} Here is an issue from Remi in which he discusses the imperative approach of Overlay. This might help to form an opinion on this topic. Thanks for your help! |
I personally am in favor of the second approach, the show function. |
I don't think the |
@bdlukaa I am not certain, because I could not yet test this approach, but I think it would work as Overlay is already imperative (see) and the Overlay is provided in the Navigator. Thus i can use the Overlay provided by the But I think this is a design decision. I think solving this with Widgets is a bit nicer, because its simpler to use for the end user of the library, but providing the However, if the |
The |
With a flutter non-native implementation the context menu will always be bound by the flutter window size, but it's possible to implement custom items. There is the class CustomContextMenuItem<T> extends ContextMenuEntry<T> {
const CustomContextMenuItem({Key? key}) : super(key: key);
@override
_CustomContextMenuItemState<T> createState() => _CustomContextMenuItemState<T>();
}
/// [ContextMenuEntry.handleTap] is not used in this state, because we want to have 3 buttons which
/// each should return a seperate value
class _CustomContextMenuItemState<T> extends ContextMenuEntryState<CustomContextMenuItem, T> {
@override
Widget build(BuildContext context) {
return Container(
child: Row(
children: [
TextButton(onPressed: () {
Navigator.pop<int>(context, 3);
}, child: Text('3')),
TextButton(onPressed: () {
Navigator.pop<int>(context, 4);
}, child: Text('4')),
TextButton(onPressed: () {
Navigator.pop<int>(context, 5);
}, child: Text('5'))
],
)
);
}
} which will result in: |
However, clicking near the edge of the flutter window will place the context menu to the inner side of the As I've said I can see positive and negative points in both approaches and thus it would be totally fine if we decide against my implementation. Maybe I will publish a small package to pub.dev so that anyone can use my implementation to create flutter context menus. Edit: wrong screenshot |
That's a really interesting drawback. @lesnitsky do you think custom items like those tags @kiesman99 showed is possible to achieve with a native implementation? |
I don't like the idea of a native implementation. It's not how Flutter works. If you want native, use react native or something like that. |
@lesnitsky does your native approach overflow over the edge of a Flutter window? |
Looking good @kiesman99! I appreciate your hard work despite the prospect of moving to native! |
Thanks @GroovinChip :) |
I don't see any problems with providing a way to build custom items in dart and forwarding those to native (lesnitsky/native_context_menu#3)
It does
That's a matter of opinion. Native views and ability to communicate with native is in flutter for a good reason and noone on flutter team will ever tell you "go build with RN if you want native look and feel" 😉. If native works better and implementation is more straightforward I see no problem going with native in flutter world I know flutter team works on context menu widget and they implemented it w/o any interactions w/ native. My motivation for building a native plugin for it, is my personal preference, and it easily could be very unpopular in general. As a macOS user I'm just very used to the look and feel of the native context menu and building exactly the same seems impossible to me (I may be wrong) And just to give another round of respect – what are you doing here looks very cool, amazing work @kiesman99! |
@lesnitsky I'm glad to hear that the native approach overflows the window, that was one of my concerns about the non-native approach. I'm also glad to hear that you don't see any problem with doing custom menu options. I think I personally would say that the native approach is the desired one. Here's what I think we should do: @lesnitsky and @kiesman99 should work on porting over the native approach in a new branch, and then we can compare each version and see which approach is more appropriate - we don't lose anything either way, because I will keep @kiesman99's PR open. What do you all think? |
Hey @lesliearkorful thank you very much!
I think it could be very interesting to build such a bridge to create custom native menus in MacOS/Windows/Linux, however i have no idea how to implement such a feature. Just to please my interest in this topic, do you have some references in which someone does something similar like this? I think your implementation is very cool, and I am looking forward to seeing this fully implemented 😊.
Personally, I think it would be possible to rebuild the context menus. The one and only thing that is currently not possible is making the context menu overflow. I don't know if this will be possible in the future when multiple flutter window instances are possible that are communicating with each other. Correct me if I am wrong @GroovinChip but the risk of this flutter macos port is that we don't replicate the UI 100%. Sure, it's best if we are able to do so, but every component is build trying to be the exact same. The main benefit will be that people can build macos applications that look almost like real macos applications, without knowing how to code native applications. I totally see that the slightest offset of UI components can destroy the image, but that's the risk by trying to rebuild the macos components in flutter.
Nonetheless, it's totally fine for me to choose the native approach, work it out and see if it suits better. I am not very familiar with native macos/windows/linux development but if I can help in any way @lesliearkorful feel free to hit me up! |
@lesliearkorful are there some links you could share on this topic? Would be very nice to follow the flutter team and what they are doing 😄 @GroovinChip, @lesliearkorful, @bdlukaa Do you guys think people outside this project would benefit from a more abstract version of my implementation? I could extract everything, build a package and publish it on pub.dev. |
You can see this on the PopupMenuButton. There is one for iOS as well, but I don't remember the name.
It's all up to you. I personally don't think it's necessary |
@kiesman99 I believe you tagged @lesliearkorful by mistake, sorry @lesliearkorful if that was spammy, but feel free to jump in 😄
No references really, I haven't done any research yet, I'm judging by what I see in desktop apps. If finder could add those menu items with tags – it's doable. Maybe some menu items will be platform specific, not sure. Just to clarify – I didn't mean you could render the whole widget tree as a menu item, but rather that current API where you only able to render text could be extended to support e.g. leading items, hotkeys indicators etc.
flutter/flutter#31955 (comment) btw 👆 @GroovinChip have you seen this? I'm guessing this will be available in Q4 stable release note: screenshots in #73882 don't look too
You write dart code either way, platform plugins are there exactly to abstract the platform specifics and allow users to deal with dart code only
Do it 🚀 |
|
@lesnitsky and @kiesman99 have you guys been working on this? |
it's not really clear what kind of effort is required from me. something specific to be done? |
I thought you guys would coordinate the effort together. At this point I'd say just go ahead and start porting, if you want. |
@lesnitsky Can I support you designing your approach or do you think it would be better if you just implement it by yourself and afterwards we compare both implementations? BTW Sorry @lesliearkorful for tagging you 😅 and thanks @lesnitsky for correcting me! |
I'm not sure what's my role here :)
dependencies:
native_context_menu:
export 'package:native_context_menu/native_context_menu.dart'; |
The reason I don't want to do this is because then I am relying on an external dependency. I would rather have your code directly integrated into |
then feel free to copy native code over to your repo. |
I think what I will do is import it as a dependency play around with it that way, while also forking the package so I can manually integrate it if the need arises. |
Okay so I've set it up like this and it works really well! I think I'm going to keep this, @kiesman99, but thank you SO MUCH for your hard work! I really do appreciate it even though I didn't pick it in the end. If you'd like, I can add you as a contributor to the repo and you can pick something else to work on? Maybe something related to date/time pickers, or dropdowns? I can also add you to the contributor Slack if you drop me your email address. |
Ah crap. Doing it this way would lower my pub score! |
@kiesman99 don't forget to send me your email address so I can add you to the contributor Slack! |
The text was updated successfully, but these errors were encountered: