私はずっとguiを開発していましたが、Mathematicaにはない一般的なコントロールオブジェクト(スピナー、ツリービュー、オープナーバーなど)を作成する必要があります。 1つはマルチパネルであり、2つ(またはそれ以上)のサブペインに分割されたペインオブジェクトであり、分割器はマウスによって設定することができる。ここに私のデュアルペインのバージョンです。あなたの意見や考え方を聞いて、2つだけではなく、いくつのサブペインにも対応できるように拡張する方法と、それを最適化する方法についても聞きたいと思います。現在、大量にロードされているサブペインの場合、それはひどく遅れています。理由はわかりません。分割ペインのGUIオブジェクト
Options[SplitPane] = {Direction -> "Vertical",
DividerWidth -> Automatic, Paneled -> {True, True}};
SplitPane[opts___?OptionQ] :=
Module[{dummy}, SplitPane[Dynamic[dummy], opts]];
SplitPane[val_, opts___?OptionQ] := SplitPane[val, {"", ""}, opts];
SplitPane[val_, content_, opts___?OptionQ] :=
SplitPane[val, content, {100, 50}, opts];
SplitPane[Dynamic[split_, arg___], {expr1_, expr2_}, {maxX_, maxY_},
opts___?OptionQ] :=
DynamicModule[{temp, dir, d, panel, coord, max, fix, val},
{dir, d, panel} = {Direction, DividerWidth, Paneled} /. {opts} /.
Options[SplitPane];
dir = dir /. {Bottom | Top | "Vertical" -> "Vertical", _ ->
"Horizontal"};
d = d /. Automatic -> 2;
split = If[NumberQ[split], split, max/2];
val = Clip[split /. {_?NumberQ -> split, _ -> maxX/2}, {0, maxX}];
{coord, max, fix} =
Switch[dir, "Vertical", {First, maxX, maxY},
"Horizontal", {(max - Last[#]) &, maxY, maxX}];
panel = (# /. {None | False ->
Identity, _ -> (Panel[#, ImageMargins -> 0,
FrameMargins -> -1] &)}) & /@ panel;
Grid[If[dir === "Vertical",
{{
Dynamic[
panel[[1]]@
Pane[expr1, ImageSize -> {split - d, fix},
ImageSizeAction -> "Scrollable", Scrollbars -> Automatic,
AppearanceElements -> None], TrackedSymbols :> {split}],
[email protected][
MouseAppearance[
Pane[Null, ImageSize -> {d*2, fix}, ImageMargins -> -1,
FrameMargins -> -1], "FrameLRResize"],
"MouseDown" :> (temp =
[email protected]@"CellContentsAbsolute";
split =
If[Abs[temp - split] <= d \[And] 0 <= temp <= max, temp,
split]),
"MouseDragged" :> (temp =
[email protected]@"CellContentsAbsolute";
split = If[0 <= temp <= max, temp, split])],
[email protected]
panel[[2]]@
Pane[expr2, ImageSizeAction -> "Scrollable",
Scrollbars -> Automatic, AppearanceElements -> None,
ImageSize -> {max - split - d, fix}]
}},
{
[email protected]
Dynamic[panel[[1]]@
Pane[expr1, ImageSize -> {fix, split - d},
ImageSizeAction -> "Scrollable", Scrollbars -> Automatic,
AppearanceElements -> None], TrackedSymbols :> {split}],
[email protected]@EventHandler[
MouseAppearance[
Pane[Null, ImageSize -> {fix, d*2}, ImageMargins -> -1,
FrameMargins -> -1], "FrameTBResize"],
"MouseDown" :> (temp =
[email protected]@"CellContentsAbsolute";
split =
If[Abs[temp - split] <= d \[And] 0 <= temp <= max, temp,
split]),
"MouseDragged" :> (temp =
[email protected]@"CellContentsAbsolute";
split = If[0 <= temp <= max, temp, split])],
[email protected]
Dynamic[panel[[2]]@
Pane[expr2, ImageSizeAction -> "Scrollable",
Scrollbars -> Automatic,
ImageSize -> {fix, max - split - d},
AppearanceElements -> None], TrackedSymbols :> {split}]
}
], Spacings -> {0, -.1}]
];
SplitPane[val_, arg___] /; NumberQ[val] :=
Module[{x = val}, SplitPane[Dynamic[x], arg]];
pos = 300;
SplitPane[
Dynamic[pos], {Manipulate[
Plot[Sin[x (1 + a x)], {x, 0, 6}], {a, 0, 2}],
Factorial[123]}, {500, 300}]
非常に印象的!最適化について:ControlActiveおよび/またはSynchronousUpdatingオプションの使用はどうですか? –
非常にうまくいっていますが、あなたの「質問」の形式はサイトには適していないことに注意してください。ここのMmaコミュニティは一般的にそれを容認していますが、投票を終了(および削除)しないように、サイトの一般的なルールに従って質問を策定してください。 –