Commit Graph

63644 Commits

Author SHA1 Message Date
Benjamin Otte
f48d81d78d inspector: Make Controller page a GtkWidget 2020-05-29 19:46:32 -04:00
Benjamin Otte
8c0b2d634b inspector: Remove private struct from controllers 2020-05-29 19:46:32 -04:00
Benjamin Otte
b2e7020b53 columnview: Add header
This uses a custom GtkColumnViewTitle widget. So far that widget is
pretty boring, but that will change once we added
resizing, reordering, dnd, sorting, hiding/showing of columns or
whatever UIs we want.
2020-05-29 19:46:32 -04:00
Benjamin Otte
e7a0858a15 tests: Add testcolumnview 2020-05-29 19:46:32 -04:00
Benjamin Otte
f4dbad4b8d columnview: Add a custom LayoutManager
The ColumnView now allocates column widths first and then the individual
rows use the new layout manager which looks at the column allocations to
allocate their children.
2020-05-29 19:46:32 -04:00
Benjamin Otte
94317e30c0 constraint-editor: Don't poke around in widget internals 2020-05-29 19:46:32 -04:00
Benjamin Otte
d56309e2a1 columnview: Fix styling with Adwaita
- Use "treeview" as the node name
- Add .view style class
2020-05-29 19:46:32 -04:00
Benjamin Otte
fbf1c98b23 inspector: Port object tree to GtkColumnView 2020-05-29 19:46:32 -04:00
Benjamin Otte
1c95f7e2d8 columnview: Add GtkColumnViewCell
It's a GtkListItemWidget subclass that tracks the column it belongs to
and allows the column to track it.

We also use this subclass to implement sizing support so columns share
the same size and get resized in sync.
2020-05-29 19:46:32 -04:00
Benjamin Otte
8f9c075069 widget: Add a hook for resizes
It's private, no APIs, we don't talk about it. But we will start using
it very soon, so we can do size request caching in columns and avoid
sizegroups...
2020-05-29 19:46:32 -04:00
Benjamin Otte
c65182af7c columnview: Implement GtkScrollable
Just forward it to the listview for now.
2020-05-29 19:46:32 -04:00
Benjamin Otte
df826ab495 columnview: Add listitems for the columns
They are not aligned in columns yet, but they do exist.
2020-05-29 19:46:32 -04:00
Benjamin Otte
6eea8b9e8b listitemwidget: Lazily create listitems
We only create them in root/unroot (they should be created in
appear/disappear, but that vfunc doesn't exist yet), that way we can
avoid expensive work while the widget isn't used for anything.
2020-05-29 19:46:32 -04:00
Benjamin Otte
755da397bc listitem: Move position/item/selected tracking to widget
This way, we can ensure it's always there when we need it (before the
item gets created) and gone when we don't (if some GC language holds on
to the item after we've destroyed the widget).
2020-05-29 19:46:32 -04:00
Benjamin Otte
e515e880e7 listitemwidget: Add a private struct
I had to rename the item property to list_item anyway, so I could just
do the next step with it.
2020-05-29 19:46:32 -04:00
Benjamin Otte
0730eb70e1 listitemfactory: Simplify
Instead of 6 vfuncs, we now have 3 and rely on the factory keeping track
of what it needs to do.

We're doing lots of dancing from one object to another here, but this
will hopefully get simpler with further commits.
2020-05-29 19:46:32 -04:00
Benjamin Otte
e0b7c82fac listitemfactory: Reorganize vfuncs
Instead of bind/rebind/update/unbind, we now just have update, and the
factories get to interpret that in the way they want.
2020-05-29 19:46:32 -04:00
Benjamin Otte
82e93d9b2e listitem: Make this a GObject
This splits GtkListItem into 2 parts:

1. GtkListItem
   This is purely a GObject with public API for developers who want to
   populate lists. There is no chance to cause conflict with GtkWidget
   properties that the list implementation assumed control over and
   defines a clear boundary.
2. GtkListItemWidget
   The widget part of the listitem. This is not only fully in control of
   the list machinery, the machinery can also use different widget
   implementations for different list widgets like I inted to for
   GtkColumnView.
2020-05-29 19:46:32 -04:00
Benjamin Otte
55dafea2e4 builder: Make gtk_builder_extend_with_template() work with objects
This will be relevant later when we introduce GtkListItem which is not a
GtkWidget.
2020-05-29 19:46:32 -04:00
Benjamin Otte
538897a055 gtk-demo: Add a Coverflow application launcher
This is roughly the simplest demo I could come up with.

But I documented it, so there's your tutorial.

Related: #2214
2020-05-29 19:46:32 -04:00
Benjamin Otte
fcab9e1c07 Add GtkSignalListItemFactory
So the poor Rust users can actually use this.

I would totally not use this ever!
2020-05-29 19:46:32 -04:00
Benjamin Otte
3e4d81417c columnview: Allow adding/removing columns
... and make that work in UI files via <child>, too.
2020-05-29 19:46:32 -04:00
Benjamin Otte
c9874ef736 gtk-demo: Add a minesweeper demo
The demo shows creating ones own listmodel and using it to fill a grid.

I am totally getting the hang of React btw:
500 lines of logic with no UI code and 100 lines of GtkBuilder XML and
I get a sweet UI.
2020-05-29 19:46:32 -04:00
Benjamin Otte
5e9abb956f Add GtkColumnView skeleton
It's just a copy/paste of the listview code with all the internals
gutted. The code doesn't do anything.
2020-05-29 19:46:32 -04:00
Benjamin Otte
930442f616 wip: Add GtkCoverFlow
The widget mostly works out of the box, but some tweaking may be
necessary (in particular in the theme) and the gtk-demo changes might
require removing before this is production-ready.
2020-05-29 19:46:32 -04:00
Benjamin Otte
fb1f719127 listbase: Take over anchor handling
With that, pretty much all code but allocating the widgets is gone from
the gridview and listview.
2020-05-29 19:46:32 -04:00
Benjamin Otte
f4150c6d64 listbase: Add vfuncs to convert positions to/from coordinates
... and use that to implement PageUp/PageDown.

With that, all keyboard handling has been moved to GtkListBase.
2020-05-29 19:46:32 -04:00
Benjamin Otte
045cea31e5 listbase: Move focus moving keybindings here
The focus tracker is not yet moved because that depends on scroll_to()
support and we don't have that yet.
Whoops.
So we use a hack.
2020-05-29 19:46:32 -04:00
Benjamin Otte
aa411acaa2 Remove gtk_selection_model_user_select_item() again
This reverts commit 6a164ab306dad9096bde736c907494c71086d3c4.

The function was awkward and we now have only one caller again, so we
can fold it back into it.
2020-05-29 19:46:32 -04:00
Benjamin Otte
a3b1e7872f listbase: Move orientable implementation here 2020-05-29 19:46:32 -04:00
Benjamin Otte
a6ff878e4c listbase: Move selection handling here 2020-05-29 19:46:32 -04:00
Benjamin Otte
9a3ef0435d listbase: Move item manager here
Nothing really changes, because both ListView and GridView still keep
self->item_manager around, but it's set up to point at the base's item
manager.

This way we can slowly move things to GtkListBase that need the item
manager (like trackers).
2020-05-29 19:46:32 -04:00
Benjamin Otte
a23dfc9861 listbase: Move GtkScrollable implementation
Shared code between GtkGridView and GtkListView.
2020-05-29 19:46:32 -04:00
Benjamin Otte
b7c04ff9a9 Add GtkListBase
This is a base item for GTK's list widgets so they can share some (read:
hopefully a lot of) code.
2020-05-29 19:46:32 -04:00
Benjamin Otte
de36e9d951 gridview: Simplify allocation code
It doesn't fix the bug I'm after, but it looks a lot better.
2020-05-29 19:46:32 -04:00
Benjamin Otte
1eabde4b6f listview: Port various gridview improvements
- Handle anchor as align + top/bottom
  This fixes behavior for cells that are higher than the view
- Add gtk_list_view_adjustment_is_flipped()
  This should fix RTL handling of horizontal lists
- Fix scrolling
  This should make scrolling more reliable, particularly on short lists
  that are only a few pages long.
2020-05-29 19:46:32 -04:00
Benjamin Otte
768b94ab90 demo: Add a file browser demo 2020-05-29 19:46:32 -04:00
Benjamin Otte
417072dd19 gridview: Add move keybindings 2020-05-29 19:46:31 -04:00
Benjamin Otte
3df388e176 gridview: Implement (un)select all
Adds listitem.select-all and listitem.unselect-all actions and installs
the same keybindings as the treeview for those actions.
2020-05-29 19:46:31 -04:00
Benjamin Otte
26065eb200 gridview: Add a focus tracker
... and use that to properly update selections when moving around with
the arrow keys.
2020-05-29 19:46:31 -04:00
Benjamin Otte
e9cc7e0917 gridview: Implement list.scroll-to action 2020-05-29 19:46:31 -04:00
Benjamin Otte
5008a11b57 gridview: Add activation 2020-05-29 19:46:31 -04:00
Benjamin Otte
5c48501961 gridview: Implement minimum row height
We only allocate a certain amount of widgets - and we don't want to run
out of them. So we make all widgets high enough for this to never
happen.
2020-05-29 19:46:31 -04:00
Benjamin Otte
97eb6c24ee gridview: Implement the list.select-item action 2020-05-29 19:46:31 -04:00
Benjamin Otte
c0a7639cbe selectionmodel: Add gtk_selection_model_user_select_item()
I'm not sure this should be public API because it's incredibly awkward.
But it should definitely be shared between list widget implementations.
2020-05-29 19:46:31 -04:00
Benjamin Otte
e795aff583 gridview: Implement anchors and scrolling 2020-05-29 19:46:31 -04:00
Benjamin Otte
5a087b5140 widget: Add gtk_widget_get_size()
A little bit of convenience.
2020-05-29 19:46:31 -04:00
Benjamin Otte
ece4958769 listitemmanager: Handle NULL factory
Just don't call it and create empty listitems.
2020-05-29 19:46:31 -04:00
Timm Bäder
b0b5c2a73f demo: Use a listview as sidebar 2020-05-29 19:46:31 -04:00
Benjamin Otte
4f2bd7331a gtk-demo: Introduce awards
We need a way to get a useful listbox, so here we go!
2020-05-29 19:46:31 -04:00