Ticket #2170: timepref.diff

File timepref.diff, 5.9 KB (added by stpere, 16 years ago)

Adds a revert button in Time preflets and fix the toggle bug on GMT/localtime radio buttons

  • src/preferences/time/TimeWindow.cpp

     
    4242{
    4343    switch(message->what) {
    4444        case H_USER_CHANGE:
     45        {
    4546            fBaseView->ChangeTime(message);
    46             break;
     47            BMessage msg(*message);
     48            msg.what = kMsgEnableRevert;
     49            fDateTimeView->MessageReceived(&msg);
     50        } break;
    4751       
    4852        case B_ABOUT_REQUESTED:
    4953            be_app->PostMessage(B_ABOUT_REQUESTED);
  • src/preferences/time/DateTimeView.cpp

     
    66 *      Andrew McCall <mccall@@digitalparadise.co.uk>
    77 *      Mike Berg <mike@berg-net.us>
    88 *      Julun <host.haiku@gmx.de>
     9 *      Philippe Saint-Pierre <stpere@gmail.com>
    910 */
    1011
    1112#include "DateTimeView.h"
     
    1314#include "CalendarView.h"
    1415#include "DateTimeEdit.h"
    1516#include "TimeMessages.h"
     17#include "DateTime.h"
    1618
    1719
     20#include <Button.h>
    1821#include <CheckBox.h>
    1922#include <Entry.h>
    2023#include <File.h>
     
    2528#include <String.h>
    2629#include <StringView.h>
    2730#include <Window.h>
     31#include <time.h>
    2832
    2933
    3034#ifdef HAIKU_TARGET_PLATFORM_HAIKU
     
    3943    : BView(frame, "dateTimeView", B_FOLLOW_NONE, B_WILL_DRAW | B_NAVIGABLE_JUMP),
    4044      fGmtTime(NULL),
    4145      fUseGmtTime(false),
    42       fInitialized(false)
     46      fInitialized(false),
     47      fLastSecond(-1),
     48      fUptime(0)
    4349{
    4450    _ReadRTCSettings();
    4551    _InitView();
     52
     53    // record the current time to enable revert.
     54    time(&fTimeAtStart);
    4655}
    4756
    4857
     
    6372
    6473        fGmtTime->SetTarget(this);
    6574        fLocalTime->SetTarget(this);
    66         fCalendarView->SetTarget(this);     
     75        fCalendarView->SetTarget(this);
     76        fRevertButton->SetTarget(this);
    6777    }
    6878}
    6979
     
    119129        }   break;
    120130
    121131        case kRTCUpdate:
    122             fUseGmtTime = !fUseGmtTime;
     132            fUseGmtTime = fGmtTime->Value() == B_CONTROL_ON;
    123133            _UpdateGmtSettings();
     134            fRevertButton->SetEnabled(true);
    124135            break;
    125136
     137        case kMsgRevert:
     138            _Revert();
     139            fRevertButton->SetEnabled(false);
     140            break;
     141   
     142        case kMsgEnableRevert:
     143            fRevertButton->SetEnabled(true);
     144            break;
     145
    126146        default:
    127147            BView::MessageReceived(message);
    128148            break;
     
    131151
    132152
    133153void
     154DateTimeView::_Revert()
     155{
     156    /*  Set the clock and calendar as they were at launch time +
     157            time ellapsed since application launch. */
     158    struct tm result;
     159    struct tm *timeinfo;
     160
     161    fUseGmtTime = fOldUseGmtTime;
     162    _UpdateGmtSettings();
     163
     164    if (fUseGmtTime) {
     165        fGmtTime->SetValue(B_CONTROL_ON);
     166    } else {
     167        fLocalTime->SetValue(B_CONTROL_ON);
     168    }
     169
     170    time_t timeNow = fTimeAtStart + (time_t)fUptime;
     171    timeinfo = localtime_r(&timeNow, &result);
     172
     173    BDateTime dateTime = BDateTime::CurrentDateTime(B_LOCAL_TIME);
     174    BTime time = dateTime.Time();
     175    BDate date = dateTime.Date();
     176    int32 sec = timeinfo->tm_sec;
     177    time.SetTime(timeinfo->tm_hour, timeinfo->tm_min, (sec > 59) ? 59 : sec);
     178    date.SetDate(timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday);
     179    dateTime.SetTime(time);
     180    dateTime.SetDate(date);
     181   
     182    set_real_time_clock(dateTime.Time_t());
     183}
     184
     185
     186void
    134187DateTimeView::_InitView()
    135188{
    136189    font_height fontHeight;
     
    192245    else
    193246        fLocalTime->SetValue(B_CONTROL_ON);
    194247
     248    fOldUseGmtTime = fUseGmtTime;
     249
     250    BRect rect = Bounds();
     251
     252    rect.left = 10;
     253    rect.top = rect.bottom - 10;
     254
     255    fRevertButton = new BButton(rect, "revert", "Revert",
     256                            new BMessage(kMsgRevert), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, B_WILL_DRAW);
     257   
     258    fRevertButton->ResizeToPreferred();
     259    fRevertButton->SetEnabled(false);
     260    float buttonHeight = fRevertButton->Bounds().Height();
     261    fRevertButton->MoveBy(0, -buttonHeight);
     262    AddChild(fRevertButton);
     263
    195264    ResizeTo(fClock->Frame().right + 10.0, fGmtTime->Frame().bottom + 10.0);
    196265}
    197266
     
    281350        && message->FindInt32("minute", &minute) == B_OK
    282351        && message->FindInt32("second", &second) == B_OK)
    283352    {
     353        if (second != fLastSecond) {
     354            fUptime++;
     355            fLastSecond = second;
     356        }
    284357        fClock->SetTime(hour, minute, second);
    285358        fTimeEdit->SetTime(hour, minute, second);
    286359    }
  • src/preferences/time/TimeMessages.h

     
    66 *      Andrew McCall, mccall@digitalparadise.co.uk
    77 *      Mike Berg <mike@berg-net.us>
    88 *      Julun <host.haiku@gmx.de>
     9 *      Philippe Saint-Pierre <stpere@gmail.com>
    910 */
    1011#ifndef TIME_MESSAGES_H
    1112#define TIME_MESSAGES_H
     
    4041// clicked on day in calendar
    4142const uint32 kDayChanged = '_kdc';
    4243
     44// clicked on revert button
     45const uint32 kMsgRevert = 'rvrt';
     46
     47const uint32 kMsgEnableRevert = 'ervr';
     48
    4349#endif //TIME_MESSAGES_H
    4450
  • src/preferences/time/DateTimeView.h

     
    66 *      Andrew McCall <mccall@@digitalparadise.co.uk>
    77 *      Mike Berg <mike@berg-net.us>
    88 *      Julun <host.haiku@gmx.de>
     9 *      Philippe Saint-Pierre <stpere@gmail.com>
    910 */
    1011#ifndef DATE_TIME_VIEW_H
    1112#define DATE_TIME_VIEW_H
     
    1920class BCalendarView;
    2021class BRadioButton;
    2122class TAnalogClock;
     23class BButton;
    2224
    2325
    2426class DateTimeView : public BView {
     
    3638        void            _WriteRTCSettings();
    3739        void            _UpdateGmtSettings();
    3840        void            _UpdateDateTime(BMessage *message);
     41        void            _Revert();
    3942
    4043    private:
    4144        BRadioButton    *fLocalTime;
     
    4548        BCalendarView   *fCalendarView;
    4649        TAnalogClock    *fClock;
    4750
     51        BButton         *fRevertButton;
     52
    4853        bool            fUseGmtTime;
     54        bool            fOldUseGmtTime;
    4955        bool            fInitialized;
     56
     57        uint32      fUptime;
     58
     59        // store the last second we had in memory, to avoid overincreasing uptime..
     60        int32           fLastSecond;
     61
     62        time_t      fTimeAtStart;
    5063};
    5164
    5265#endif  // DATE_TIME_VIEW_H