Incorporate work done by James Urquhart (jamesu):
* Use our own BBitmapStringField implementation which also requires our own BColumn implementation. This is just a visual improvement which makes both the eventual partiton icon and device label indent with the outline level of the list item * when setting the Unmount menu item enabled state, check wether the partition in question is the /boot volume and disallow unmounting. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23845 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
e951046835
commit
aa1df4dc4d
@ -29,6 +29,8 @@
|
||||
#include <MenuBar.h>
|
||||
#include <Menu.h>
|
||||
#include <Screen.h>
|
||||
#include <Volume.h>
|
||||
#include <VolumeRoster.h>
|
||||
|
||||
|
||||
class ListPopulatorVisitor : public BDiskDeviceVisitor {
|
||||
@ -81,9 +83,6 @@ private:
|
||||
i++) {
|
||||
fPartitionList->AddSpace(partition->ID(), offset, size);
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "failed to get partitioning info: %s\n",
|
||||
strerror(ret));
|
||||
}
|
||||
}
|
||||
|
||||
@ -480,7 +479,18 @@ fCreateMenu->SetEnabled(false);
|
||||
// fDeleteMI->SetEnabled(!partition->IsMounted());
|
||||
fDeleteMI->SetEnabled(false);
|
||||
fMountMI->SetEnabled(!partition->IsMounted());
|
||||
fUnmountMI->SetEnabled(partition->IsMounted());
|
||||
|
||||
if (partition->IsMounted()) {
|
||||
// see if this partition is the boot volume
|
||||
BVolume volume;
|
||||
BVolume bootVolume;
|
||||
if (BVolumeRoster().GetBootVolume(&bootVolume) == B_OK
|
||||
&& partition->GetVolume(&volume) == B_OK) {
|
||||
fUnmountMI->SetEnabled(volume != bootVolume);
|
||||
} else {
|
||||
fUnmountMI->SetEnabled(true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fInitMenu->SetEnabled(false);
|
||||
fDeleteMI->SetEnabled(false);
|
||||
|
@ -4,6 +4,7 @@
|
||||
*
|
||||
* Authors:
|
||||
* Ithamar R. Adema <ithamar@unet.nl>
|
||||
* James Urquhart
|
||||
* Stephan Aßmus <superstippi@gmx.de>
|
||||
*/
|
||||
#include "PartitionList.h"
|
||||
@ -13,10 +14,132 @@
|
||||
#include <Path.h>
|
||||
|
||||
|
||||
// #pragma mark - BBitmapStringField
|
||||
|
||||
|
||||
BBitmapStringField::BBitmapStringField(BBitmap* bitmap, const char* string)
|
||||
: Inherited(string)
|
||||
, fBitmap(bitmap)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BBitmapStringField::~BBitmapStringField()
|
||||
{
|
||||
delete fBitmap;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BBitmapStringField::SetBitmap(BBitmap* bitmap)
|
||||
{
|
||||
delete fBitmap;
|
||||
fBitmap = bitmap;
|
||||
// TODO: cause a redraw?
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark - PartitionColumn
|
||||
|
||||
|
||||
float PartitionColumn::fTextMargin = 0.0;
|
||||
|
||||
|
||||
PartitionColumn::PartitionColumn(const char* title, float width, float minWidth,
|
||||
float maxWidth, uint32 truncateMode, alignment align)
|
||||
: Inherited(title, width, minWidth, maxWidth, align),
|
||||
fTruncateMode(truncateMode)
|
||||
{
|
||||
SetWantsEvents(true);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
PartitionColumn::DrawField(BField* field, BRect rect, BView* parent)
|
||||
{
|
||||
if (fTextMargin == 0.0) {
|
||||
// we are the first column to draw something and need to
|
||||
// init the text margin
|
||||
BFont font;
|
||||
parent->GetFont(&font);
|
||||
fTextMargin = ceilf(font.Size() * 0.8);
|
||||
}
|
||||
|
||||
BBitmapStringField* bitmapField
|
||||
= dynamic_cast<BBitmapStringField*>(field);
|
||||
BStringField* stringField = dynamic_cast<BStringField*>(field);
|
||||
|
||||
if (bitmapField) {
|
||||
const BBitmap* bitmap = bitmapField->Bitmap();
|
||||
|
||||
// figure out the placement
|
||||
float x = 0.0;
|
||||
BRect r = bitmap ? bitmap->Bounds() : BRect(0, 0, 15, 15);
|
||||
float y = rect.top + ((rect.Height() - r.Height()) / 2);
|
||||
float width = 0.0;
|
||||
|
||||
switch (Alignment()) {
|
||||
default:
|
||||
case B_ALIGN_LEFT:
|
||||
case B_ALIGN_CENTER:
|
||||
x = rect.left + fTextMargin;
|
||||
width = rect.right - (x + r.Width()) - (2 * fTextMargin);
|
||||
r.Set(x + r.Width(), rect.top, rect.right - width, rect.bottom);
|
||||
break;
|
||||
|
||||
case B_ALIGN_RIGHT:
|
||||
x = rect.right - fTextMargin - r.Width();
|
||||
width = (x - rect.left - (2 * fTextMargin));
|
||||
r.Set(rect.left, rect.top, rect.left + width, rect.bottom);
|
||||
break;
|
||||
}
|
||||
|
||||
if (width != bitmapField->Width()) {
|
||||
BString truncatedString(bitmapField->String());
|
||||
parent->TruncateString(&truncatedString, fTruncateMode, width + 2);
|
||||
bitmapField->SetClippedString(truncatedString.String());
|
||||
bitmapField->SetWidth(width);
|
||||
}
|
||||
|
||||
// draw the bitmap
|
||||
if (bitmap) {
|
||||
parent->SetDrawingMode(B_OP_ALPHA);
|
||||
parent->DrawBitmap(bitmap, BPoint(x, y));
|
||||
parent->SetDrawingMode(B_OP_OVER);
|
||||
}
|
||||
|
||||
// draw the string
|
||||
DrawString(bitmapField->ClippedString(), parent, r);
|
||||
|
||||
} else if (stringField) {
|
||||
|
||||
float width = rect.Width() - (2 * fTextMargin);
|
||||
|
||||
if (width != stringField->Width()) {
|
||||
BString truncatedString(stringField->String());
|
||||
|
||||
parent->TruncateString(&truncatedString, fTruncateMode, width + 2);
|
||||
stringField->SetClippedString(truncatedString.String());
|
||||
stringField->SetWidth(width);
|
||||
}
|
||||
|
||||
DrawString(stringField->ClippedString(), parent, rect);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
PartitionColumn::AcceptsField(const BField* field) const
|
||||
{
|
||||
return dynamic_cast<const BStringField*>(field) != NULL;
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark - PartitionListRow
|
||||
|
||||
|
||||
static const char* kUnavailableString = "";
|
||||
|
||||
enum {
|
||||
// kBitmapColumn,
|
||||
kDeviceColumn,
|
||||
kFilesystemColumn,
|
||||
kVolumeNameColumn,
|
||||
@ -32,11 +155,20 @@ PartitionListRow::PartitionListRow(BPartition* partition)
|
||||
, fOffset(partition->Offset())
|
||||
, fSize(partition->Size())
|
||||
{
|
||||
// SetField(new BBitmapField(NULL), kBitmapColumn);
|
||||
|
||||
BPath path;
|
||||
partition->GetPath(&path);
|
||||
SetField(new BStringField(path.Path()), kDeviceColumn);
|
||||
|
||||
BBitmap* icon = NULL;
|
||||
if (partition->IsDevice()) {
|
||||
icon_size size = B_MINI_ICON;
|
||||
icon = new BBitmap(BRect(0, 0, size - 1, size - 1), B_RGBA32);
|
||||
if (partition->GetIcon(icon, size) != B_OK) {
|
||||
delete icon;
|
||||
icon = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
SetField(new BBitmapStringField(icon, path.Path()), kDeviceColumn);
|
||||
|
||||
if (partition->ContainsFileSystem()) {
|
||||
SetField(new BStringField(partition->ContentType()), kFilesystemColumn);
|
||||
@ -66,11 +198,10 @@ PartitionListRow::PartitionListRow(partition_id parentID, off_t offset,
|
||||
, fOffset(offset)
|
||||
, fSize(size)
|
||||
{
|
||||
// SetField(new BBitmapField(NULL), kBitmapColumn);
|
||||
// TODO: design icon for spaces on partitions
|
||||
SetField(new BBitmapStringField(NULL, "-"), kDeviceColumn);
|
||||
|
||||
SetField(new BStringField("-"), kDeviceColumn);
|
||||
|
||||
SetField(new BStringField("Empty"), kFilesystemColumn);
|
||||
SetField(new BStringField("<empty>"), kFilesystemColumn);
|
||||
SetField(new BStringField(kUnavailableString), kVolumeNameColumn);
|
||||
|
||||
SetField(new BStringField(kUnavailableString), kMountedAtColumn);
|
||||
@ -83,18 +214,16 @@ PartitionListRow::PartitionListRow(partition_id parentID, off_t offset,
|
||||
PartitionListView::PartitionListView(const BRect& frame, uint32 resizeMode)
|
||||
: Inherited(frame, "storagelist", resizeMode, 0, B_NO_BORDER, true)
|
||||
{
|
||||
// AddColumn(new BBitmapColumn("", 20, 20, 100, B_ALIGN_CENTER),
|
||||
// kBitmapColumn);
|
||||
AddColumn(new BStringColumn("Device", 150, 50, 500, B_TRUNCATE_MIDDLE),
|
||||
kDeviceColumn);
|
||||
AddColumn(new BStringColumn("Filesystem", 100, 50, 500, B_TRUNCATE_MIDDLE),
|
||||
kFilesystemColumn);
|
||||
AddColumn(new BStringColumn("Volume Name", 130, 50, 500, B_TRUNCATE_MIDDLE),
|
||||
kVolumeNameColumn);
|
||||
AddColumn(new BStringColumn("Mounted At", 100, 50, 500, B_TRUNCATE_MIDDLE),
|
||||
kMountedAtColumn);
|
||||
AddColumn(new BStringColumn("Size", 100, 50, 500, B_TRUNCATE_END,
|
||||
B_ALIGN_RIGHT), kSizeColumn);
|
||||
AddColumn(new PartitionColumn("Device", 150, 50, 500,
|
||||
B_TRUNCATE_MIDDLE), kDeviceColumn);
|
||||
AddColumn(new PartitionColumn("Filesystem", 100, 50, 500,
|
||||
B_TRUNCATE_MIDDLE), kFilesystemColumn);
|
||||
AddColumn(new PartitionColumn("Volume Name", 130, 50, 500,
|
||||
B_TRUNCATE_MIDDLE), kVolumeNameColumn);
|
||||
AddColumn(new PartitionColumn("Mounted At", 100, 50, 500,
|
||||
B_TRUNCATE_MIDDLE), kMountedAtColumn);
|
||||
AddColumn(new PartitionColumn("Size", 100, 50, 500,
|
||||
B_TRUNCATE_END, B_ALIGN_RIGHT), kSizeColumn);
|
||||
|
||||
SetSortingEnabled(false);
|
||||
}
|
||||
|
@ -4,23 +4,61 @@
|
||||
*
|
||||
* Authors:
|
||||
* Ithamar R. Adema <ithamar@unet.nl>
|
||||
* James Urquhart
|
||||
* Stephan Aßmus <superstippi@gmx.de>
|
||||
*/
|
||||
#ifndef PARTITIONLIST_H
|
||||
#define PARTITIONLIST_H
|
||||
|
||||
|
||||
class PartitionListRow;
|
||||
class PartitionListView;
|
||||
|
||||
|
||||
#include <ColumnListView.h>
|
||||
#include <ColumnTypes.h>
|
||||
#include <Partition.h>
|
||||
|
||||
|
||||
class BPartition;
|
||||
|
||||
|
||||
// A field type displaying both a bitmap and a string so that the
|
||||
// tree display looks nicer (both text and bitmap are indented)
|
||||
class BBitmapStringField : public BStringField {
|
||||
typedef BStringField Inherited;
|
||||
public:
|
||||
BBitmapStringField(BBitmap* bitmap,
|
||||
const char* string);
|
||||
virtual ~BBitmapStringField();
|
||||
|
||||
void SetBitmap(BBitmap* bitmap);
|
||||
const BBitmap* Bitmap() const
|
||||
{ return fBitmap; }
|
||||
|
||||
private:
|
||||
BBitmap* fBitmap;
|
||||
};
|
||||
|
||||
|
||||
// BColumn for PartitionListView which knows how to render
|
||||
// a BBitmapStringField
|
||||
class PartitionColumn : public BTitledColumn {
|
||||
typedef BTitledColumn Inherited;
|
||||
public:
|
||||
PartitionColumn(const char* title,
|
||||
float width, float minWidth,
|
||||
float maxWidth, uint32 truncateMode,
|
||||
alignment align = B_ALIGN_LEFT);
|
||||
|
||||
virtual void DrawField(BField* field, BRect rect,
|
||||
BView* parent);
|
||||
|
||||
virtual bool AcceptsField(const BField* field) const;
|
||||
|
||||
private:
|
||||
uint32 fTruncateMode;
|
||||
static float fTextMargin;
|
||||
};
|
||||
|
||||
|
||||
// BRow for the PartitionListView
|
||||
class PartitionListRow : public BRow {
|
||||
typedef BRow Inherited;
|
||||
public:
|
||||
@ -30,6 +68,8 @@ public:
|
||||
|
||||
partition_id ID() const
|
||||
{ return fPartitionID; }
|
||||
partition_id ParentID() const
|
||||
{ return fParentID; }
|
||||
off_t Offset() const
|
||||
{ return fOffset; }
|
||||
off_t Size() const
|
||||
|
Loading…
Reference in New Issue
Block a user