Patch from Maciej Janiszewski which adds support for hiding offline contacts, message notifications and caya can now set the window title to unread state, all functions can be disabled from settings as well. Thanks\!
This commit is contained in:
parent
53c5c02d66
commit
007af3d89a
|
@ -22,10 +22,12 @@
|
||||||
#include <SpaceLayoutItem.h>
|
#include <SpaceLayoutItem.h>
|
||||||
#include <ScrollView.h>
|
#include <ScrollView.h>
|
||||||
#include <String.h>
|
#include <String.h>
|
||||||
|
#include <Notification.h>
|
||||||
|
|
||||||
#include "BitmapView.h"
|
#include "BitmapView.h"
|
||||||
#include "CayaMessages.h"
|
#include "CayaMessages.h"
|
||||||
#include "CayaProtocolMessages.h"
|
#include "CayaProtocolMessages.h"
|
||||||
|
#include "CayaPreferences.h"
|
||||||
#include "ChatWindow.h"
|
#include "ChatWindow.h"
|
||||||
#include "ContactLinker.h"
|
#include "ContactLinker.h"
|
||||||
#include "EditingFilter.h"
|
#include "EditingFilter.h"
|
||||||
|
@ -188,6 +190,32 @@ ChatWindow::ImMessage(BMessage* msg)
|
||||||
|
|
||||||
// Message received, clear status anyway
|
// Message received, clear status anyway
|
||||||
fStatus->SetText("");
|
fStatus->SetText("");
|
||||||
|
|
||||||
|
if (IsActive()) break;
|
||||||
|
|
||||||
|
// Mark unread window
|
||||||
|
if (CayaPreferences::Item()->MarkUnreadWindow) {
|
||||||
|
BString title = "[*] ";
|
||||||
|
title<<fContactLinker->GetName();
|
||||||
|
SetTitle(title);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the user want the notification
|
||||||
|
if (!CayaPreferences::Item()->NotifyNewMessage)
|
||||||
|
break;
|
||||||
|
|
||||||
|
BString notify_message;
|
||||||
|
notify_message << "You've got new message from ";
|
||||||
|
notify_message << fContactLinker->GetName().String();
|
||||||
|
|
||||||
|
|
||||||
|
BNotification notification(B_INFORMATION_NOTIFICATION);
|
||||||
|
notification.SetGroup(BString("Caya"));
|
||||||
|
notification.SetTitle(BString("New message"));
|
||||||
|
notification.SetIcon(fAvatar->Bitmap());
|
||||||
|
notification.SetContent(notify_message);
|
||||||
|
notification.Send();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IM_CONTACT_STARTED_TYPING:
|
case IM_CONTACT_STARTED_TYPING:
|
||||||
|
@ -206,6 +234,11 @@ ChatWindow::ImMessage(BMessage* msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ChatWindow::WindowActivated(bool active)
|
||||||
|
{
|
||||||
|
SetTitle(fContactLinker->GetName());
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ChatWindow::ObserveString(int32 what, BString str)
|
ChatWindow::ObserveString(int32 what, BString str)
|
||||||
|
|
|
@ -23,6 +23,7 @@ public:
|
||||||
virtual void ShowWindow();
|
virtual void ShowWindow();
|
||||||
|
|
||||||
virtual void MessageReceived(BMessage* message);
|
virtual void MessageReceived(BMessage* message);
|
||||||
|
void WindowActivated(bool active);
|
||||||
virtual bool QuitRequested();
|
virtual bool QuitRequested();
|
||||||
|
|
||||||
void UpdateAvatar();
|
void UpdateAvatar();
|
||||||
|
|
|
@ -278,11 +278,13 @@ MainWindow::ImMessage(BMessage* msg)
|
||||||
|
|
||||||
// Add or remove item
|
// Add or remove item
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case CAYA_OFFLINE:
|
/*case CAYA_OFFLINE:
|
||||||
// By default offline contacts are hidden
|
// By default offline contacts are hidden
|
||||||
|
if (!CayaPreferences::Item()->HideOffline)
|
||||||
|
break;
|
||||||
if (HasItem(rosterItem))
|
if (HasItem(rosterItem))
|
||||||
RemoveItem(rosterItem);
|
RemoveItem(rosterItem);
|
||||||
return;
|
return;*/
|
||||||
default:
|
default:
|
||||||
// Add item because it has a non-offline status
|
// Add item because it has a non-offline status
|
||||||
if (!HasItem(rosterItem))
|
if (!HasItem(rosterItem))
|
||||||
|
@ -377,7 +379,11 @@ void
|
||||||
MainWindow::AddItem(RosterItem* item)
|
MainWindow::AddItem(RosterItem* item)
|
||||||
{
|
{
|
||||||
// Don't add offline items and avoid duplicates
|
// Don't add offline items and avoid duplicates
|
||||||
if ((item->Status() == CAYA_OFFLINE) || HasItem(item))
|
if ((item->Status() == CAYA_OFFLINE)
|
||||||
|
&& CayaPreferences::Item()->HideOffline)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (HasItem(item))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Add item and sort
|
// Add item and sort
|
||||||
|
|
|
@ -16,11 +16,14 @@ CayaPreferencesData::CayaPreferencesData()
|
||||||
MoveToCurrentWorkspace(true),
|
MoveToCurrentWorkspace(true),
|
||||||
RaiseOnMessageReceived(false),
|
RaiseOnMessageReceived(false),
|
||||||
RaiseUserIsTyping(false),
|
RaiseUserIsTyping(false),
|
||||||
|
MarkUnreadWindow(true),
|
||||||
HideCayaDeskbar(false),
|
HideCayaDeskbar(false),
|
||||||
DisableReplicant(true),
|
DisableReplicant(true),
|
||||||
IgnoreEmoticons(false),
|
IgnoreEmoticons(false),
|
||||||
NotifyProtocolStatus(true),
|
NotifyProtocolStatus(true),
|
||||||
NotifyContactStatus(false)
|
NotifyContactStatus(false),
|
||||||
|
NotifyNewMessage(true),
|
||||||
|
HideOffline(true)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +63,7 @@ CayaPreferencesData::FlattenedSize() const
|
||||||
// NOTE add the size of every settings
|
// NOTE add the size of every settings
|
||||||
// you added.
|
// you added.
|
||||||
|
|
||||||
ssize_t size = sizeof(bool) * 8;
|
ssize_t size = sizeof(bool) * 11;
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
@ -80,9 +83,11 @@ CayaPreferencesData::Flatten(BPositionIO* flatData) const
|
||||||
_AddBool(flatData, MoveToCurrentWorkspace);
|
_AddBool(flatData, MoveToCurrentWorkspace);
|
||||||
_AddBool(flatData, RaiseOnMessageReceived);
|
_AddBool(flatData, RaiseOnMessageReceived);
|
||||||
_AddBool(flatData, RaiseUserIsTyping);
|
_AddBool(flatData, RaiseUserIsTyping);
|
||||||
|
_AddBool(flatData, MarkUnreadWindow);
|
||||||
|
|
||||||
_AddBool(flatData, NotifyProtocolStatus);
|
_AddBool(flatData, NotifyProtocolStatus);
|
||||||
_AddBool(flatData, NotifyContactStatus);
|
_AddBool(flatData, NotifyContactStatus);
|
||||||
|
_AddBool(flatData, NotifyNewMessage);
|
||||||
|
|
||||||
// Replicant
|
// Replicant
|
||||||
_AddBool(flatData, HideCayaDeskbar);
|
_AddBool(flatData, HideCayaDeskbar);
|
||||||
|
@ -91,14 +96,15 @@ CayaPreferencesData::Flatten(BPositionIO* flatData) const
|
||||||
// Chat window
|
// Chat window
|
||||||
_AddBool(flatData, IgnoreEmoticons);
|
_AddBool(flatData, IgnoreEmoticons);
|
||||||
|
|
||||||
|
// Contact list
|
||||||
|
_AddBool(flatData, HideOffline);
|
||||||
|
|
||||||
// Usage example for strings :
|
// Usage example for strings :
|
||||||
// _AddString(flatData, yourBString.String());
|
// _AddString(flatData, yourBString.String());
|
||||||
|
|
||||||
// NOTE : The order is very important, Unflatten and Flatten
|
// NOTE : The order is very important, Unflatten and Flatten
|
||||||
// classes should read/write the values in the same order.
|
// classes should read/write the values in the same order.
|
||||||
|
|
||||||
_AddString(flatData, "str");
|
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,9 +150,11 @@ CayaPreferencesData::Unflatten(type_code code, BPositionIO* flatData)
|
||||||
MoveToCurrentWorkspace = _ReadBool(flatData);
|
MoveToCurrentWorkspace = _ReadBool(flatData);
|
||||||
RaiseOnMessageReceived = _ReadBool(flatData);
|
RaiseOnMessageReceived = _ReadBool(flatData);
|
||||||
RaiseUserIsTyping = _ReadBool(flatData);
|
RaiseUserIsTyping = _ReadBool(flatData);
|
||||||
|
MarkUnreadWindow = _ReadBool(flatData);
|
||||||
|
|
||||||
NotifyProtocolStatus = _ReadBool(flatData);
|
NotifyProtocolStatus = _ReadBool(flatData);
|
||||||
NotifyContactStatus = _ReadBool(flatData);
|
NotifyContactStatus = _ReadBool(flatData);
|
||||||
|
NotifyNewMessage = _ReadBool(flatData);
|
||||||
|
|
||||||
// Replicant
|
// Replicant
|
||||||
HideCayaDeskbar = _ReadBool(flatData);
|
HideCayaDeskbar = _ReadBool(flatData);
|
||||||
|
@ -155,6 +163,9 @@ CayaPreferencesData::Unflatten(type_code code, BPositionIO* flatData)
|
||||||
// Chat window
|
// Chat window
|
||||||
IgnoreEmoticons = _ReadBool(flatData);
|
IgnoreEmoticons = _ReadBool(flatData);
|
||||||
|
|
||||||
|
// Contact list
|
||||||
|
HideOffline = _ReadBool(flatData);
|
||||||
|
|
||||||
// Usage example for strings :
|
// Usage example for strings :
|
||||||
// const char* str = _ReadString(flatData);
|
// const char* str = _ReadString(flatData);
|
||||||
// yourBString.SetTo(str);
|
// yourBString.SetTo(str);
|
||||||
|
@ -195,9 +206,8 @@ const char*
|
||||||
CayaPreferencesData::_ReadString(BPositionIO* data)
|
CayaPreferencesData::_ReadString(BPositionIO* data)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
char* ret;
|
|
||||||
data->Read(&len, sizeof(size_t));
|
data->Read(&len, sizeof(size_t));
|
||||||
ret = new char[len];
|
char* ret = new char[len];
|
||||||
data->Read(ret, len);
|
data->Read(ret, len);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -28,13 +28,17 @@ public:
|
||||||
bool MoveToCurrentWorkspace;
|
bool MoveToCurrentWorkspace;
|
||||||
bool RaiseOnMessageReceived;
|
bool RaiseOnMessageReceived;
|
||||||
bool RaiseUserIsTyping;
|
bool RaiseUserIsTyping;
|
||||||
|
bool MarkUnreadWindow;
|
||||||
bool NotifyProtocolStatus;
|
bool NotifyProtocolStatus;
|
||||||
bool NotifyContactStatus;
|
bool NotifyContactStatus;
|
||||||
|
bool NotifyNewMessage;
|
||||||
|
|
||||||
bool HideCayaDeskbar;
|
bool HideCayaDeskbar;
|
||||||
bool DisableReplicant;
|
bool DisableReplicant;
|
||||||
|
|
||||||
bool IgnoreEmoticons;
|
bool IgnoreEmoticons;
|
||||||
|
|
||||||
|
bool HideOffline;
|
||||||
private:
|
private:
|
||||||
void _AddBool(BPositionIO* data, bool value) const;
|
void _AddBool(BPositionIO* data, bool value) const;
|
||||||
void _AddString(BPositionIO* data,
|
void _AddString(BPositionIO* data,
|
||||||
|
|
|
@ -28,6 +28,9 @@ const uint32 kRaiseOnMessageReceived = 'FCmr';
|
||||||
const uint32 kRaiseUserIsTyping = 'FCit';
|
const uint32 kRaiseUserIsTyping = 'FCit';
|
||||||
const uint32 kNotifyProtocolsLogin = 'NTpl';
|
const uint32 kNotifyProtocolsLogin = 'NTpl';
|
||||||
const uint32 kNotifyContactStatus = 'NTcl';
|
const uint32 kNotifyContactStatus = 'NTcl';
|
||||||
|
const uint32 kNotifyNewMessage = 'NTms';
|
||||||
|
const uint32 kMarkUnreadWindow = 'MKuw';
|
||||||
|
const uint32 kHideOffline = 'HiOf';
|
||||||
|
|
||||||
|
|
||||||
PreferencesBehavior::PreferencesBehavior()
|
PreferencesBehavior::PreferencesBehavior()
|
||||||
|
@ -38,6 +41,10 @@ PreferencesBehavior::PreferencesBehavior()
|
||||||
fOnIncoming->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT, B_ALIGN_MIDDLE));
|
fOnIncoming->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT, B_ALIGN_MIDDLE));
|
||||||
fOnIncoming->SetFont(be_bold_font);
|
fOnIncoming->SetFont(be_bold_font);
|
||||||
|
|
||||||
|
fHideOffline = new BCheckBox("HideOfflineContacts",
|
||||||
|
"Hide offline contacts",
|
||||||
|
new BMessage(kHideOffline));
|
||||||
|
|
||||||
fToCurrentWorkspace = new BCheckBox("ToCurrentWorkspace",
|
fToCurrentWorkspace = new BCheckBox("ToCurrentWorkspace",
|
||||||
"Move window to current workspace",
|
"Move window to current workspace",
|
||||||
new BMessage(kToCurrentWorkspace));
|
new BMessage(kToCurrentWorkspace));
|
||||||
|
@ -55,8 +62,8 @@ PreferencesBehavior::PreferencesBehavior()
|
||||||
fPlaySoundOnMessageReceived->SetEnabled(false); // not implemented
|
fPlaySoundOnMessageReceived->SetEnabled(false); // not implemented
|
||||||
|
|
||||||
fMarkUnreadWindow = new BCheckBox("MarkUnreadWindow",
|
fMarkUnreadWindow = new BCheckBox("MarkUnreadWindow",
|
||||||
"Mark unread window chat", NULL);
|
"Mark unread window chat", new BMessage(kMarkUnreadWindow));
|
||||||
fMarkUnreadWindow->SetEnabled(false);
|
/*fMarkUnreadWindow->SetEnabled(false); implementing it right now*/
|
||||||
|
|
||||||
fMarkUnreadReplicant = new BCheckBox("MarkUnreadReplicant",
|
fMarkUnreadReplicant = new BCheckBox("MarkUnreadReplicant",
|
||||||
"Mark unread the Deskbar Replicant", NULL);
|
"Mark unread the Deskbar Replicant", NULL);
|
||||||
|
@ -75,12 +82,16 @@ PreferencesBehavior::PreferencesBehavior()
|
||||||
fNotifyContactStatus = new BCheckBox("EnableContactNotify",
|
fNotifyContactStatus = new BCheckBox("EnableContactNotify",
|
||||||
"Enable contact status notifications",new BMessage(kNotifyContactStatus));
|
"Enable contact status notifications",new BMessage(kNotifyContactStatus));
|
||||||
|
|
||||||
|
fNotifyNewMessage = new BCheckBox("EnableMessageNotify",
|
||||||
|
"Enable message notifications", new BMessage(kNotifyNewMessage));
|
||||||
|
|
||||||
const float spacing = be_control_look->DefaultItemSpacing();
|
const float spacing = be_control_look->DefaultItemSpacing();
|
||||||
|
|
||||||
SetLayout(new BGroupLayout(B_HORIZONTAL, spacing));
|
SetLayout(new BGroupLayout(B_HORIZONTAL, spacing));
|
||||||
AddChild(BGroupLayoutBuilder(B_VERTICAL)
|
AddChild(BGroupLayoutBuilder(B_VERTICAL)
|
||||||
.Add(fOnIncoming)
|
.Add(fOnIncoming)
|
||||||
.AddGroup(B_VERTICAL, spacing)
|
.AddGroup(B_VERTICAL, spacing)
|
||||||
|
.Add(fHideOffline)
|
||||||
.Add(fToCurrentWorkspace)
|
.Add(fToCurrentWorkspace)
|
||||||
.Add(fRaiseOnMessageReceived)
|
.Add(fRaiseOnMessageReceived)
|
||||||
.Add(fRaiseUserIsTyping)
|
.Add(fRaiseUserIsTyping)
|
||||||
|
@ -93,6 +104,7 @@ PreferencesBehavior::PreferencesBehavior()
|
||||||
.AddGroup(B_VERTICAL, spacing)
|
.AddGroup(B_VERTICAL, spacing)
|
||||||
.Add(fNotifyProtocols)
|
.Add(fNotifyProtocols)
|
||||||
.Add(fNotifyContactStatus)
|
.Add(fNotifyContactStatus)
|
||||||
|
.Add(fNotifyNewMessage)
|
||||||
. SetInsets(spacing * 2, spacing, spacing, spacing)
|
. SetInsets(spacing * 2, spacing, spacing, spacing)
|
||||||
.End()
|
.End()
|
||||||
.AddGlue()
|
.AddGlue()
|
||||||
|
@ -105,22 +117,30 @@ PreferencesBehavior::PreferencesBehavior()
|
||||||
void
|
void
|
||||||
PreferencesBehavior::AttachedToWindow()
|
PreferencesBehavior::AttachedToWindow()
|
||||||
{
|
{
|
||||||
|
fHideOffline->SetTarget(this);
|
||||||
fToCurrentWorkspace->SetTarget(this);
|
fToCurrentWorkspace->SetTarget(this);
|
||||||
fRaiseUserIsTyping->SetTarget(this);
|
fRaiseUserIsTyping->SetTarget(this);
|
||||||
fRaiseOnMessageReceived->SetTarget(this);
|
fRaiseOnMessageReceived->SetTarget(this);
|
||||||
fNotifyProtocols->SetTarget(this);
|
fNotifyProtocols->SetTarget(this);
|
||||||
fNotifyContactStatus->SetTarget(this);
|
fNotifyContactStatus->SetTarget(this);
|
||||||
|
fNotifyNewMessage->SetTarget(this);
|
||||||
|
|
||||||
|
fHideOffline->SetValue(
|
||||||
|
CayaPreferences::Item()->HideOffline);
|
||||||
fToCurrentWorkspace->SetValue(
|
fToCurrentWorkspace->SetValue(
|
||||||
CayaPreferences::Item()->MoveToCurrentWorkspace);
|
CayaPreferences::Item()->MoveToCurrentWorkspace);
|
||||||
fRaiseUserIsTyping->SetValue(
|
fRaiseUserIsTyping->SetValue(
|
||||||
CayaPreferences::Item()->RaiseUserIsTyping);
|
CayaPreferences::Item()->RaiseUserIsTyping);
|
||||||
fRaiseOnMessageReceived->SetValue(
|
fRaiseOnMessageReceived->SetValue(
|
||||||
CayaPreferences::Item()->RaiseOnMessageReceived);
|
CayaPreferences::Item()->RaiseOnMessageReceived);
|
||||||
|
fMarkUnreadWindow->SetValue(
|
||||||
|
CayaPreferences::Item()->MarkUnreadWindow);
|
||||||
fNotifyProtocols->SetValue(
|
fNotifyProtocols->SetValue(
|
||||||
CayaPreferences::Item()->NotifyProtocolStatus);
|
CayaPreferences::Item()->NotifyProtocolStatus);
|
||||||
fNotifyContactStatus->SetValue(
|
fNotifyContactStatus->SetValue(
|
||||||
CayaPreferences::Item()->NotifyContactStatus);
|
CayaPreferences::Item()->NotifyContactStatus);
|
||||||
|
fNotifyNewMessage->SetValue(
|
||||||
|
CayaPreferences::Item()->NotifyNewMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -128,6 +148,10 @@ void
|
||||||
PreferencesBehavior::MessageReceived(BMessage* message)
|
PreferencesBehavior::MessageReceived(BMessage* message)
|
||||||
{
|
{
|
||||||
switch (message->what) {
|
switch (message->what) {
|
||||||
|
case kHideOffline:
|
||||||
|
CayaPreferences::Item()->HideOffline
|
||||||
|
= fHideOffline->Value();
|
||||||
|
break;
|
||||||
case kToCurrentWorkspace:
|
case kToCurrentWorkspace:
|
||||||
CayaPreferences::Item()->MoveToCurrentWorkspace
|
CayaPreferences::Item()->MoveToCurrentWorkspace
|
||||||
= fToCurrentWorkspace->Value();
|
= fToCurrentWorkspace->Value();
|
||||||
|
@ -148,6 +172,14 @@ PreferencesBehavior::MessageReceived(BMessage* message)
|
||||||
CayaPreferences::Item()->NotifyContactStatus
|
CayaPreferences::Item()->NotifyContactStatus
|
||||||
= fNotifyContactStatus->Value();
|
= fNotifyContactStatus->Value();
|
||||||
break;
|
break;
|
||||||
|
case kNotifyNewMessage:
|
||||||
|
CayaPreferences::Item()->NotifyNewMessage
|
||||||
|
= fNotifyNewMessage->Value();
|
||||||
|
break;
|
||||||
|
case kMarkUnreadWindow:
|
||||||
|
CayaPreferences::Item()->MarkUnreadWindow
|
||||||
|
= fMarkUnreadWindow->Value();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
BView::MessageReceived(message);
|
BView::MessageReceived(message);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ public:
|
||||||
private:
|
private:
|
||||||
|
|
||||||
BStringView* fOnIncoming;
|
BStringView* fOnIncoming;
|
||||||
|
BCheckBox* fHideOffline;
|
||||||
BCheckBox* fToCurrentWorkspace;
|
BCheckBox* fToCurrentWorkspace;
|
||||||
BCheckBox* fRaiseOnMessageReceived;
|
BCheckBox* fRaiseOnMessageReceived;
|
||||||
BCheckBox* fRaiseUserIsTyping;
|
BCheckBox* fRaiseUserIsTyping;
|
||||||
|
@ -31,6 +32,7 @@ private:
|
||||||
BStringView* fNotifications;
|
BStringView* fNotifications;
|
||||||
BCheckBox* fNotifyProtocols;
|
BCheckBox* fNotifyProtocols;
|
||||||
BCheckBox* fNotifyContactStatus;
|
BCheckBox* fNotifyContactStatus;
|
||||||
|
BCheckBox* fNotifyNewMessage;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ const uint32 kApply = 'SAVE';
|
||||||
|
|
||||||
|
|
||||||
PreferencesDialog::PreferencesDialog()
|
PreferencesDialog::PreferencesDialog()
|
||||||
: BWindow(BRect(0, 0, 500, 500), "Preferences", B_TITLED_WINDOW,
|
: BWindow(BRect(0, 0, 500, 550), "Preferences", B_TITLED_WINDOW,
|
||||||
B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_CLOSE_ON_ESCAPE)
|
B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_CLOSE_ON_ESCAPE)
|
||||||
{
|
{
|
||||||
BTabView* tabView = new BTabView("tabView", B_WIDTH_AS_USUAL);
|
BTabView* tabView = new BTabView("tabView", B_WIDTH_AS_USUAL);
|
||||||
|
|
Ŝarĝante…
Reference in New Issue