<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jan 7, 2014 at 4:36 PM, Mark Gaiser <span dir="ltr"><<a href="mailto:markg85@gmail.com" target="_blank">markg85@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im"><br></div><div class="im">>> * Controls for the day names (mon, tue, wed, thu, fri, sat, sun). And<br>


>> the ability to change the name to shorter/longer variants.<br>
><br>
><br>
> What would be the usecase for longer variants? Full screen/huuge calendars I<br>
> assume? Here's an important question imho - should the days be capitalized<br>
> or not? Qt's locale follows, well, the locale and for example the Czech<br>
> weekday names are not capitalized because we do not capitalize them, like<br>
> for example Friday in English is. However, when it's put standalone, I think<br>
> it should always be capitalized. It simply looks better.<br>
<br>
</div>You're thinking just about the calendar grid now. For that you don't<br>
need more then 3 char day names.<br>
But my intention is more to have a general data model that can be<br>
easily used for more then just a calendar grid though the grid would<br>
be it's primary goal.<br>
So it is tailored towards a grid, but not limited to it.<br></blockquote><div><br></div><div>Well...if you think it makes sense to have a data model for 7 different strings...ok, I guess.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


An example where you might want longer daynames is in a event overview<br>
which just sums up the upcoming events. The current plasma calendar<br>
even has that so i think it should have the ability to set the day<br>
name lengths with the possibilities that you can also find in QDate.<br></blockquote><div><br></div><div>Sure, but why would you mix a whole model to display one string, which you can obtain very easily in other ways?</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
As for capitalize the first char.<br>
I think the model (the C++ side) should just return the string that<br>
the locale gives. Without modification. The QML side - the view - can<br>
then capitalize it. It's kinda pointless to add a model property:<br>
<br>
bool capitalizeFirstDayChar..<br>
<br>
Possible, but seems a bit odd.<br></blockquote><div><br></div><div>I didn't mean it as an option, but rather do it always. As I said, Qt's locale returns values not really suitable to be used standalone (for other than English locales anyway). Plus you'd get inconsistent looks across languages (imho the UI should just always be consistent in these things, no matter what the locale returns - and we currently are in the plasmoid).</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
><br>
>><br>
>> * Controls for the weeknumbers that are shown in the grid.<br>
><br>
><br>
> Optional with default off. But if the visual side is made good enough<br>
> looking, it might work. But in 76% of times you don't need to know the week<br>
> number, then it just clutters the grid.<br>
<br>
</div>It's just a model :) on/off is decided by the view i guess.<br></blockquote><div><br></div><div>Well when you say "Controls", I think (visual) QML controls, ie. the View.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div class="im">><br>
>><br>
>> As far as i understand the QML code, all but the weeknumbers are in.<br>
><br>
><br>
> Yup, but it's made as one single component (for consumers) iirc.<br>
><br>
>><br>
>> -- Locale --<br>
>> In KDE there was already an issue with differences between the<br>
>> JavaScript date object and the QDate object. I don't know the fine<br>
>> details here, someone else will probably fill that in i hope. I know<br>
>> there where issues, just not what exactly.<br>
><br>
><br>
> I already posted it before, but for the sake of completeness, QDate starts<br>
> weekdays and months with 1 while JS Date object starts both with 0, so eg.<br>
> QDate weekday value 7 is Sunday while JS Date would give you "undefined" for<br>
> 7.<br>
<br>
</div>Right, so we either should do no modification in from the C++ model<br>
and let it be done by the view. Or we should do all modifications -<br>
which i can't even think of - and just hope that it won't ever<br>
interfere with the view.<br>
I vote for sending date objects to QML and let the view decide what to<br>
do with it.<br></blockquote><div><br></div><div>I /think/ that if you pass a QDate object from C++ to JS, it's automatically converted. But needs to be checked.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div class="im">><br>
>><br>
>> -- C++ part --<br>
>> This is the part where i really would like some feedback. I have a<br>
>> general idea of how it should be done, but i don't know the details or<br>
>> implications it might have.<br>
>> It is my hope that calendar controls like Mitch is proposing now will<br>
>> be extensive enough to simply swap the models to another backend.<br>
>> Akonadi comes to mind. However, there should obviously be a<br>
>> non-akonadi based version for default Qt usage.<br>
>><br>
>> My idea on that is as follows. Again, i don't know the implications of<br>
>> it or if it's really viable to take this route. Feedback is very much<br>
>> welcome here!<br>
>> The calendar model should be based on a new model that provides some<br>
>> default functionality and properties. I would say:<br>
>> QAbstractCalendarModel : public QAbstractListModel { ... }<br>
>> This model should provide the default - should be implemented -<br>
>> properties:<br>
>> * day -- INT number of the day in a current month<br>
><br>
><br>
> You mean like 31, 28 etc? Or what would this property be for? The selected<br>
> day? Then let's name it properly.<br>
<br>
</div>Interesting!<br>
I actually thing "day" is named properly :)<br>
<br>
The model basically has a list of days (one for each in a month). Each<br>
day had a number which "day" would be.<br>
Perhaps "dayInMonth" would be more clear?<br>
Yes, this is:<br>
1, 2, 3, 4, .... 28, 29, 30...<br>
<br>
Note that the abstract model has no knowledge about the selected day.<br>
It just has a list of days represented in a model, another model with<br>
all events for the days in the model and that should be about it.<br>
Besides some convenient models for the week numbers and day names.<br>
<br>
However, your reply did make me wonder how i would ever make this work<br>
if the abstract model doesn't know about the currently selected day. I<br>
now think it does need to know abut that, but doesn't need to<br>
implement it. It must know the properties which classes implementing<br>
the abstract model should re-implement to give it meaning.<br></blockquote><div><br></div><div>I still have no clue what would I use this property for.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div class="im"><br>
><br>
>><br>
>> * isCurrentMonth -- returns true for the current month (aka, the month<br>
>> you are viewing in the calendar). Returns false for the days before<br>
>> and after the currently viewing month. Based on the position in the<br>
>> grid you can then calculate if the entry where "isCurrentMonth"<br>
>> returns false is before or after the current month.<br>
><br>
><br>
> "isCurrentMonth" implicates "is this the month that currently really is",<br>
> eg. QString("January").isCurrentMonth() = true;. If it's supposed to be the<br>
> month currently in the view, let's name it "isCurrentlyDisplayedMonth" or<br>
> something.<br>
<br>
</div>+1. isCurrentlyDisplayedMonth makes more sense.<br>
<div class="im">><br>
>><br>
>> * containsEvents -- true if the day contains events, false otherwise<br>
><br>
><br>
> How would one then retrieve the events for the given day? Also, wouldn't it<br>
> be better to have a model role returning this?<br>
<br>
</div>This is something i thought - at the time i wrote the proposal - would<br>
make since since you could use this to check if a day has events. If<br>
it does then you can load the model for that day. However, that<br>
doesn't make any sense anymore. Specially because i forgot to name a<br>
property like:<br>
<br>
QAIM events<br>
<br>
I think it's better to just return a model for the events in the<br>
current day. That makes more sense anyway.<br></blockquote><div><br></div><div>Yes. However I think we're still operating on different ideas.</div><div><br></div><div>So basically you want to have a model providing data...and you expose this data through properties? That sounds horribly wrong.</div>

<div><br></div><div>If we're making a model, let's make it a proper model and return /all/ the data through the QVariant data(..) method. Let's define set of roles which the subclassing model must implement. Then it becomes quite an easy task.</div>

<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
However, that poses another difficulty. multiday events!<br>
<br>
In a grid view you might not want to see multiday events for each day<br>
it occurs. You just want to see it when it starts (like it's now in<br>
plasma calendar). However, in a list view or timeline view you<br>
actually might want to see it for each day.<br>
<br>
While writing this mail i'm thinking about leaving out a property for<br>
events altogether and make a function available:<br>
Type would be a flags field with one or more of the following:<br>
- Events<br>
- Todo<br>
- Holiday<br>
- Journal<br>
<br>
includeMultiday.<br>
true: for each day the event occurs, you will have an event object<br>
false(default): only the first day of the overlap will have a event object<br>
<br>
QAbstractListModel events(QDate, Type, bool includeMultiday)<br>
<br>
And a range version of the same function:<br>
<br>
QAbstractListModel events(QDate start, QDate end, Type, bool includeMultiday)<br>
<br>
I think that would be very flexible and accommodate every need.<br>
<div class="im"><br>
<br>
><br>
>><br>
>><br>
>> "day" and "isCurrentMonth" should be convenience implemented in the<br>
>> QAbstractCalendarModel.<br>
>><br>
>> Next there should be a model for core Qt calendar usage. Or in other<br>
>> terms: no akonadi dependency.<br>
>> That would be a class like:<br>
>> QSimpleCalendarModel : public QAbstractCalendarModel { ... }<br>
>><br>
>> That class should probably have some basic storage in json files<br>
>> somewhere? Or ini or sqlite or..? Just something so that it can be<br>
>> used out of the box without any other requirements beyond Qt.<br>
>> Till this point is what would probably go in Qt. Everything after this<br>
>> line becomes Akonadi specific and should not be in Qt.<br>
><br>
><br>
> What would it store? I mean what events would be in the simple calendar? If<br>
> you want that to be a base class for other people implementing calendar<br>
> events backend, I think the Abstract class is enough? Or is that meant just<br>
> as an basic example? Then it can go to qt's examples and use whatever is the<br>
> easiest. Imho.<br>
<br>
</div>Well, you can have a calendar without akonadi you know ;) It's more<br>
intended to be a simple calendar storage type for those wanting to<br>
have a calendar but not from anything fancy like akonadi. Just some<br>
local simple storage. How it would store it or where. I don't know.<br>
This is not a class i would implement :)<br></blockquote><div><br></div><div>Yes, I know. I was wondering about the purpose of this class.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


I would make the abstract version and the akonadi based<br>
implementation. This class would probably be done by Mitch i guess?<br>
<div class="im">><br>
>><br>
>> If a structure like the above is approved then Akonadi can be very<br>
>> easily used in KDE with the Qt calendar components.<br>
>> We'd just have to make out own QAbstractCalendarModel implementation<br>
>> that uses akonadi data. That would be a class like:<br>
>> (K)AconadiCalendarModel : public QAbstractCalendarModel { ... }<br>
>><br>
>> It can still use the base QAbstractCalendarModel implementation for<br>
>> it's grid stuff and re-implement the "containsEvents" property to be<br>
>> filled with data from akonadi.<br>
><br>
><br>
> How would that be filled with data if it returns boolean? I mean, what do<br>
> you want to fill where? :)<br>
><br>
><br>
> Overall I like the real model backend, however I think your proposal also<br>
> could use definition of roles for the model and what would be returned for<br>
> those roles (what comes to mind is single vs. multiple events in one day,<br>
> would it always return a list or a string in one case and list in other<br>
> case...etc).<br>
<br>
</div>The return for those roles is decided in the class re-implementing<br>
QAbstractCalendarModel. In this case the akonadi implementation.<br>
How that would look like is completely unknown right now. You can<br>
however expect it to resemble the stuff i already made for my calendar<br>
components ;)<br></blockquote><div><br></div><div>Sure, but you need to define which roles is the subclass going to reimplement and also define what those roles actually mean.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<br>
But i guess there is one class missing here.<br>
The object it returns for events in a day must be known in<br>
QAbstractCalendarModel thus a class has to be defined for that as<br>
well.<br>
<br>
Just on the top of my head i'd like to propose (probably very incomplete):<br>
<br>
QAbstractCalendarData<br>
{<br>
public:<br>
  QVariant data(int col) { return QVariant(); }<br>
}<br>
<br>
That class is intended to used per calendar day where the class is the<br>
"wrapper" around an event, journal item, holiday or todo item. So you<br>
will very likely get multiple instances of that class per day. As much<br>
as you have events/jour.... you get the point.<br></blockquote><div><br></div><div>Why not simply return a list in the main QAbstractCalendarModel rather than reimplementing a whole model? Sounds overly complicated...?</div>

<div><br></div></div><div>Cheers</div>-- <br><div><span style="color:rgb(102,102,102)">Martin Klapetek | KDE Developer</span></div>
</div></div>